hdu 1561 樹形DP入門題

2022-05-24 10:57:14 字數 924 閱讀 4279

這個題目是說 每個點有權值,有些點的得到需要先得到某點,問你選m個點能夠得到的最大值

很明顯是有依賴的揹包,而且應該是有依賴中有依賴(雖然我覺得題目並沒有很明確地說)~

這樣的話 我們就構建dp[i][j],i為i號點,j為它選了裡面的幾個點。。。。。

這樣的話 我們就發現其實是個樹,點的值取決於子點的選法。

方程dp[k][j]=max(dp[k][j],dp[k][j-kk]+dp[t[k][i]][kk])

表示在第i個k的子點中選kk個點加上目前k號點選j-kk個點與直接在k號點選j個點誰更優。。。

我們可以知道dp[k][1]=val[k],因為選乙個點的話必須選自己 = =

於是這樣的題可以有兩種基本寫法,一是先確定了1的地位(這樣或許算是常數優化),二是馬後炮最後才補上這個val,

依賴關係形成森林,要先把樹轉換成森林才能進行樹形dp

增加乙個根節點0即可

dp[i][j]表示以i為根的子樹選擇j個點所能達到的最優值

答案即為dp[0][m+1]:因為增加了乙個根節點

view code

#include

#include

int n,m;

int num[250];

int map[250][250];

int dp[250][250];

bool vis[250];

int max(int a,int b)

void dfs(int p)}}

}int main()

m++;//

增加乙個點,森林轉換成樹

for(i=0;i<=n;i++)

}dfs(0);

printf("

%d\n

",dp[0][m]);

}return

0;}

HDU 1561 樹形dp 揹包

分析 攻下一座城堡的前提是要先攻下它的前驅城堡,建立乙個以0為根結點的樹,他的權值為0 dp i,j 表示以i為根結點去j個的最大值。dp i,1 v i v i 為攻下i城堡獲得的寶藏 對與u結點取j 1個,可以轉化為以孩子i為根取k個 以自己為根取j 1 k個和自己取j 1個的最大值 為什麼是j...

HDU 1561 樹形DP 揹包

題目鏈結 題目大意 從樹根開始取點。最多取m個點,問最大價值。解題思路 cost 1的樹形揹包。有個虛根0,取這個虛根也要cost,所以最後的結果是dp 0 m 1 本題是cost 1的特殊揹包問題,在兩個for迴圈上有乙個優化。for f 1.j.cost for 1.k.j cost 其中f為當...

HDU 1561(樹形dp 揹包問題)

題目 click 每個城堡被攻克,必須之前有乙個特定的城堡被攻克,才能攻占這個城堡。形成了一種子節點與父節點的關係,聯想到樹形dp取解決。走子節點必先走其父親節點,一次建樹,若無則父親節點為0 dp i j 表示以i為節點,取j個城堡寶藏獲得的最大值。include include include ...