先入門一下~
題意:某公司要舉辦一次晚會,但是為了使得晚會的氣氛更加活躍,每個參加晚會的人都不希望在晚會中見到他的直接上司,現在已知每個人的活躍指數和上司關係(當然不可能存在環),求邀請哪些人(多少人)來能使得晚會的總活躍指數最大。
思路:任何乙個點的取捨可以看作一種決策,那麼狀態就是在某個點取的時候或者不取的時候,以他為根的子樹能有的最大活躍總值。分別可以用
f[i,1]
和f[i,0]
表示第i個人來和不來。
當i來的時候,dp[i][1] += dp[j][0];//j為i的下屬
當i不來的時候,dp[i][0] +=max(dp[j][1],dp[j][0]);//j為i的下屬
以下**參考:
//ac code:
[cpp]view plain
copy
print?
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
#define maxn 6005
intn;
intdp[maxn][2],father[maxn];
//dp[i][0]0表示不去,dp[i][1]1表示去了
bool
visited[maxn];
void
tree_dp(
intnode)
} } int
main()
root = 0;//記錄父結點
bool
beg = 1;
while
(scanf(
"%d %d"
,&c,&f),c||f)
} while
(father[root])
//查詢父結點
root=father[root];
tree_dp(root);
intimax=max(dp[root][0],dp[root][1]);
printf("%d\n"
,imax);
} return
0;
}
樹形DP入門
hdu1011 一棵樹,有n個結點,每個結點有v個bug,有w的brain。我從1號結點開始走,帶著m個戰士。1個戰士可以消滅20個bugs,如果我把某個結點的所有bug都消滅了我就能得到那個結點的brain。如果想攻擊當前結點,那麼必須先攻擊了它的父結點 1號點除外 其中當你攻占了當前結點,你可以...
樹形dp 入門
以前看過點樹形dp,不過全忘了。今天做了一道入門級的簡單題,回憶了一下。所謂樹形dp就是在一棵樹上進行狀態轉移。有時候他的狀態轉移方程比普通dp還簡單,只不過建圖比較麻煩,順便複習了一下鄰接表的用法,真是好久不練就都忘了。下面是一道最基礎的題,要求父節點和兒子節點不能同時選,求最大權值,很明顯狀態轉...
(樹形dp入門)
題目一 anniversary party 題意 有n個客人,每個客人有乙個開心值,然後客人k是客人l的主管,客人k和客人l不能一起被邀請參加party,問 邀請人的最大開心值是多少?題解 顯然這是道樹形dp 的題,我們定義 dp i 1 表示邀請客人i,dp i 0 表示不邀請客人i,故轉移方程為...