樹形DP入門

2021-07-08 15:34:19 字數 786 閱讀 6475

hdu1011:

一棵樹,有n個結點,每個結點有v個bug,有w的brain。我從1號結點開始走,帶著m個戰士。

1個戰士可以消滅20個bugs,如果我把某個結點的所有bug都消滅了我就能得到那個結點的brain。

如果想攻擊當前結點,那麼必須先攻擊了它的父結點(1號點除外)。

其中當你攻占了當前結點,你可以分派人手,走向幾個不同的子結點,去攻占更多。也就是說,不是單一的路徑。

# include

# include

# define n 105

struct nodeedge[2*n];

int head[n],tol,visit[n],ans[n],bug[n],n,m,dp[n][n],f[n][n];

void add(int a,int b)

int max(int a,int b)

void dfs(int u)

}/*for(j=0;j<=m;j++)*/}

}tt=(ans[u]+19)/20;

for(j=tt;j<=m;j++)

dp[u][j]=f[u][j-tt]+bug[u];

}int main()

memset(visit,0,sizeof(visit));

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

memset(f,0,sizeof(f));

if(m==0)

dfs(1);

printf("%d\n",dp[1][m]);

}return 0;

}

樹形dp 入門

以前看過點樹形dp,不過全忘了。今天做了一道入門級的簡單題,回憶了一下。所謂樹形dp就是在一棵樹上進行狀態轉移。有時候他的狀態轉移方程比普通dp還簡單,只不過建圖比較麻煩,順便複習了一下鄰接表的用法,真是好久不練就都忘了。下面是一道最基礎的題,要求父節點和兒子節點不能同時選,求最大權值,很明顯狀態轉...

樹形DP入門

先入門一下 題意 某公司要舉辦一次晚會,但是為了使得晚會的氣氛更加活躍,每個參加晚會的人都不希望在晚會中見到他的直接上司,現在已知每個人的活躍指數和上司關係 當然不可能存在環 求邀請哪些人 多少人 來能使得晚會的總活躍指數最大。思路 任何乙個點的取捨可以看作一種決策,那麼狀態就是在某個點取的時候或者...

(樹形dp入門)

題目一 anniversary party 題意 有n個客人,每個客人有乙個開心值,然後客人k是客人l的主管,客人k和客人l不能一起被邀請參加party,問 邀請人的最大開心值是多少?題解 顯然這是道樹形dp 的題,我們定義 dp i 1 表示邀請客人i,dp i 0 表示不邀請客人i,故轉移方程為...