HDOJ 1561 樹形DP,泛化揹包

2021-06-16 23:13:54 字數 741 閱讀 7515

剛看題...覺得這不是棵樹...可能有迴路...仔細一想..這還真是棵樹(森林)...這是由於每個城堡所需要提前擊破的城堡至多乙個..對於乙個城堡.其所需提前擊破的城堡作為其父親構圖....

dp[k][i]代表以k為跟的子樹擊破i個城堡所能獲得的最大收益...泛化揹包問題...

program:

#include#include#include#include#include#include#include#define ll long long

#define oo 1000000007

#define maxn 205

using namespace std;

vectortree[maxn];

int n,m,v[maxn],ans[maxn],dp[maxn][maxn];

bool root[maxn];

void dfs(int x,int t)

return;

}int main()

memset(dp,0,sizeof(dp));

memset(ans,0,sizeof(ans));

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

if (root[i])

for (i=m;i>=0;i--)

if (ans[i]) break;

printf("%d\n",ans[i]);

}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 ...