今天考試考了乙個區間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...