這個月一直搞dp了,狀壓,數字,樹形,感覺雖然有時訓練很辛苦,但真的很充實。
這個星期看了一些樹形dp的資料。
樹形dp簡單來說就是在樹上的dp,這裡的很多題,都和揹包有聯絡,從乙個根節點開始,分配方案給它的子樹。
有乙個很有意思的題。沒有上司的聚會(hdu 1520)。
大致題意就是說,要舉辦乙個聚會,每個人都有乙個權值,然後所有人都不希望碰到自己的直系上司。顯然沒有成環的現象。
那麼這些人的關係就可以組成乙個樹。典型的樹形dp。
乙個人無非2個狀態,來或者不來。
那麼我們就可以建乙個dp[i][j],代表第i個來或者不來的最大權值。j=0不來,j=1來。
在用dfs搜尋一遍就好了。
下面附上**。
#include
using
namespace
std;
int val[6005],dp[6005][3];
int n;
bool vis[6005];
vector
v[6005];
void dfs(int a)
}int main()
int a,b;
while(scanf("%d%d",&a,&b) && a+b)
dfs(1);
printf("%d\n",max(dp[1][0],dp[1][1]));
}return
0;}
樹形dp總結
from 列出一些經典問題吧 1 給出一棵樹 每個節點有權值 要求父節點和子節點不能同時取 求能夠取得的最大值 hdu1520 2 給出一棵樹,求離每個節點最遠的點的距離 hdu2196 3 1 在乙個地圖上,有n座城堡,每座城堡都有一定的寶物,在每次遊戲中允許攻克m個城堡並獲得裡面的寶物。但由於地...
樹形DP總結
換根 fat結點更新u結點子結點 dp fat ans fat max dp u 0 老方法 更新根節點 ans u dp u max dp fat 0 第一次dfs 回溯時處理子結點為u向下的簡單路徑第一大和第二大 第二次dfs 遞迴處理子結點為u向上的簡單路徑最大 const int n 5e5...
樹形DP簡單總結
樹的特徵 1.n個點 只有n 1條邊的無向圖 2.無向圖里 任意兩點有且只有一條路 3.乙個點只有乙個前驅 但可以有多個後繼 4.無向圖沒有環 樹形dp 由於樹有著天然的遞迴結構 父子結構 而且它作為一種特殊的圖 可以描述許多複雜的資訊 因此在樹就成了一種很適合dp的框架 問題 給你一棵樹 要求用最...