poj3342 poj2342 樹形dp入門

2021-06-25 14:10:00 字數 1225 閱讀 2646

poj3342

最近做樹形dp,渣渣**成喳喳喳辣,真是不開森。。。。

還是適合做基礎入門題。。。╮(╯▽╰)╭

題意:比較好理解。就是一棵樹,選m個點,兒子和父親不能同時選。問最多能選多少個(題目中說的是上級,當然我這裡省略就是用父親節點和孩子結點表示啦~~)

其實dp的內容很好想,d[i][0]表示第i個點不選的結果,d[i][1]表示第i個點選的結果,轉移方程d[i][0]=sigma(max(d[j][0],d[j][1])) ,就是兒子可選可不選,選出最大的就ok

d[i][1]=sigma(d[j][0]) 父親選了,當然兒子就不能選。

主要問題是建圖,我可能還是不太會,因為這裡用的map和vector 。

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

#define maxn 220

vectoredge[maxn]; //記錄邊的資訊 edge[i][j]表示以i為起點的第j條邊的終點的序列號

int d[maxn][2];

void dfs(int u)

{ d[u][0]=0;d[u][1]=1;

for(int i=0;imp;

char bos[110],a[110],b[110];

while(~scanf("%d",&n) && n)

{ tot=0;

for(i=0;id[i][1])

{for(j=0;j

做完上一題,做這個他覺得思路更清晰了,不過還是錯了一點,就是這個題的根節點沒有直接給出,還要自己找。我剛開始是覺得根節點不會出現在孩子學列的那一排,也就是程式中的所有的a,然後把所有的a儲存起來,拍一下序,看缺誰,誰就是根節點。但是wa。。。

後來看了別人的方法,是孩子父親儲存在一起,一起找,另開了個陣列,然後才a的。。。。。。。

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

#define maxn 6002

vectoredge[maxn];

int d[maxn][2];

int w[maxn];

int fa[maxn];

void dfs(int u)

{ int i,j;

d[u][0]=0;d[u][1]=w[u];

for(i=0;i

poj 2342 深度搜尋

問題描述 公司辦晚會,每個人都有乙個活躍度,為了氣氛好,要求不能同時把上司和員工分在一起 約束條件 讓你去做出選擇,盡力讓總活躍度最大。很明顯乙個動態規劃問題。sample input 7 1 可以畫棵樹11 1111 1 3 l k,k是l的上司 3是1的上司 5思路是 深搜便利該樹,已訪問過的結...

POJ2342 簡單樹形dp

因為在做hdu4126的時候需要使用樹形dp,然而我對樹形dp一點也不了解,所以做一下樹形dp的題來加深其了解,題目不說了 dp方程是 dp i 0 max dp j 0 dp j 1 i是j的父親 dp i 1 dp j 0 其中dp i 0 表示該人沒來 dp i 1 表示該人來了 貼 incl...

poj2342 樹形dp入門

題意 公司要舉辦一次晚會,但是為了使得晚會的氣氛更加活躍,每個參加晚會的人都不希望在晚會中見到他的直接上司 現在已知每個人的活躍指數和上司關係,求邀請哪些人來能使得晚會的總活躍指數最大。分析 毫無疑問肯定需要先建樹,然後就是從這棵樹裡面選擇一些點,當然不能暴力。我們用dp i 0 表示不選擇第i棵樹...