luogu P1040 加分二叉樹 題解

2022-05-05 21:27:08 字數 939 閱讀 5745

今天考試考了乙個區間dp...沒錯就是這個...

太蒟了真是連區間dp都不會...看了看題解也看不懂,於是請了某獴dalao給補充了一下。

在這裡把自己的理解寫下來,算是給一些像我一樣不會區間dp的萌新們一點指引。

所謂區間dp,顧名思義就是在一段區間上的動態規劃。

它既要滿足dp問題的最優子結構和無後效性外,還應該符合在區間上操作的特點。我們是用小區間的最優推出大區間的最優。

通常我們是拿f[i][j]表示區間i—j。在這個題中,我們就用f[i][j]表示區間i—j的最大權值。

對於區間dp,我們通常是一層迴圈列舉區間的長度,一層迴圈列舉區間的左端點。然後進行我們需要的dp就行了。

具體對這個題的做法**裡有注釋。

#include #include #include #include using namespace std;

int n, v[31], f[31][31], root[31][31], l, r;

void print(int l, int r)

int main()

for(int k = 2; k <= n; k++)//列舉區間大小

for(int l = 1; l+k-1 <= n; l++)//列舉區間內的端點

//右子樹為空,只有左子樹 的情況

if(f[l][r] < v[r]+f[l][r-1])

//左子樹為空,只有右子樹 的情況

for(int i = l+1; i <= r-1; i++)

}//左右子樹均不為空

}//整個是在列舉在一段區間內,分別以每個點做根的情況

printf("%d\n",f[1][n]);//很明顯我們所求的是1—n區間

print(1,n);//輸出路徑不多講了

return 0;

}

luogu P1040 加分二叉樹

設乙個n個節點的二叉樹tree的中序遍歷為 1,2,3,n 其中數字1,2,3,n為節點編號。每個節點都有乙個分數 均為正整數 記第i個節點的分數為di,tree及它的每個子樹都有乙個加分,任一棵子樹subtree 也包含tree本身 的加分計算方法如下 subtree的左子樹的加分 subtree...

luogu P1040 加分二叉樹

題目詳情 題目分析 解法是記憶化搜尋。val i j 存的是i到j區間內的最高加分。tree 33 據題意可得,tree陣列存的是樹的中序遍歷順序。root i j 存的是tree陣列從i到j的最優根,即以此為根保證此子樹最高加分。通過中序遍歷性質可知 若x為根節點,1 x 1為左子樹,x 1 n為...

洛谷1040 加分二叉樹

題目描述 設乙個n個節點的二叉樹tree的中序遍歷為 1,2,3,n 其中數字1,2,3,n為節點編號。每個節點都有乙個分數 均為正整數 記第i個節點的分數為di,tree及它的每個子樹都有乙個加分,任一棵子樹subtree 也包含tree本身 的加分計算方法如下 subtree的左子樹的加分 su...