HDU 3672 Caves 樹形DP 揹包

2021-08-07 07:39:57 字數 705 閱讀 6192

hdu - 3672 

題意:給一棵帶權樹,初始位置在根節點,最多有1000次詢問,問你在x(x<5e6)範圍內最大能探索多少個點。

如果探索完所有點並回到根節點,則所用時間為探索過的所有節點之間的權值的兩倍(來回兩次)。如果不回到根節點,則減掉所有探索點到當前根節點的最長路徑。

因為查詢次數較多,範圍較大,所以我們記錄探索完i個點所需最小x。

所以對於乙個節點x 設dp[x][i][0]為探索完i個節點(包括自己,下同)後返回x,dp[x][i][1]表示探索i個點不返回自己的最小路程。

dp[x][i][0]由根節點的dp[y][j][0]通過揹包很容易得到。dp[x][i][1]則是選擇乙個兒子節點的dp[y][j][1]和其他兒子節點得到最小值

accode

#include#include#include#include#includeusing namespace std;

const int inf=0x3f3f3f3f;

int dp[505][505][2],num[505],fa[505],n,m,b[505];

struct edge

};vectorg[505];

void dfs(int x)

num[x]=1;

for(int i=0;i1;v--)

break;}}

//for(int i=0;i<=n;i++)cout<

hdu1011(揹包樹形DP)

沒有完全理解這題,m個人,攻打乙個map,map的入口是1,在攻打某個結點之前要先攻打其他乙個結點 dp i j 表示m個人攻打以第i個結點為根節點的子樹得到的最優解 狀態轉移dp i j max dp i j dp i k dp t j k 其中t是i結點的子節點 如下 include inclu...

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為當...