495/老師用了區間dp;
dp[l]
[r]是左邊界l,右邊界r的最大加分
同時還需要設乙個k表示根節點,然後dp[l]
[k-1
]表示左子樹最大加分,dp[k+1]
[r]表示有指數最大加分。然後遍歷這
一區間最大的加分就可,題目中要求輸出乙個前序的序列,那我們把每乙個最大區間也就是dp[l]
[k-1
]*dp[k+1]
[r]+w[k]
的根節點記下來就好了用g[l]
[r]來儲存.
最後說一下題意
對與乙個根節點
1.若只有乙個子樹,則根的加分為子樹的分值*
1+根的分數。
2.若是有兩個子樹,則根的加分為左子樹分值*右子樹分值+根的分數
3.若沒有子樹,則根的加分為根的分數本身。
最後說下**吧,也不是很長
#include
using
namespace std;
const
int n=35;
int w[n]
,dp[n]
[n],g[n]
[n];
void
print
(int l,
int r)
//輸出前序 根、左、右
intmain
(void
)else}}
} cout<[n]
,n);
}
AcWing 479 加分二叉樹(區間dp)
題目大意 構造一顆 n nn 個節點的二叉樹,其編號為 1,2 3,n 1,2,3,n 1,2,3,n 每個節點都有乙個權值 w iw i wi 子樹的權值 左子樹權值 右子樹權值 根節點權值 若某個子樹為空,規定其權值為 1 11。葉子的加分就是葉節點本身的分數,不考慮它的空子樹。試求一棵符合中序...
479 加分二叉樹
原題傳送門 設乙個n個節點的二叉樹tree的中序遍歷為 1,2,3,n 其中數字1,2,3,n為節點編號。每個節點都有乙個分數 均為正整數 記第i個節點的分數為di,tree及它的每個子樹都有乙個加分,任一棵子樹subtree 也包含tree本身 的加分計算方法如下 subtree的左子樹的加分 s...
加分二叉樹
描述 設乙個n個節點的二叉樹tree的中序遍歷為 l,2,3,n 其中數字1,2,3,n為節點編號。每個節點都有乙個分數 均為正整數 記第i個節點的分數為di,tree及它的每個子樹都有乙個加分,任一棵子樹subtree 也包含tree本身 的加分計算方法如下 subtree的左子樹的加分 subt...