poj2342 樹形dp入門

2021-07-10 07:29:24 字數 1056 閱讀 4893

題意:

公司要舉辦一次晚會,但是為了使得晚會的氣氛更加活躍,每個參加晚會的人都不希望在晚會中見到他的直接上司

,現在已知每個人的活躍指數和上司關係,求邀請哪些人來能使得晚會的總活躍指數最大。

分析:毫無疑問肯定需要先建樹,然後就是從這棵樹裡面選擇一些點,當然不能暴力。我們用dp[i][0]表示不選擇第i棵樹,他的子數所能取得的最大值,

dp[i][1]表示選取第i棵樹的最大值。

然後我們就可以得到遞推方程,dp[i][1] += dp[j][0]  //j是i的直接子節點     dp[i][0] += max(dp[j][0] , dp[j][1]) ;

#include #include #include #include #include #include #include #include using namespace std ;

#define mem(a) memset(a,0,sizeof(a))

#define inf 100000005

int const maxn = 6005;

int n ;

bool vis[maxn];

int father[maxn];

//表示的是直接上下級關係,也就是在樹中father[i]=j表示的是i是j的子樹

int dp[maxn][2];

//dp[i][0]表示的是樹建立好之後不選擇i所能得到的i及i的子樹的最大值

//dp[i][1]表示選擇i

void dfs(int root)

}}int main()

mem(father);

int root = 1 ; //表示的是這課樹的根

int l,k;

while(scanf("%d%d",&l,&k)&&(l+k))

while(father[root])

mem(vis);

dfs(root);

printf("%d\n",max(dp[root][0],dp[root][1]));

}return 0 ;

}

POJ 2342 (樹形dp入門)

樹形dp,現在才開始看,先敲個水題入個門吧,這個題很簡單,知道樹dp的概念大概就能做出來 我們用dp root 2 代表當前節點這個人是否參加當前聚會的方法數,dp i 0 代表不參加加,dp i 1 代表參加,那麼dp i 0 max dp j 0 dp j 1 dp i 1 dp j 0 其中j...

POJ 2342 樹形DP入門題

有乙個大學的慶典晚會,想邀請一些在大學任職的人來參加,每個人有自己的搞笑值,但是現在遇到乙個問題就是如果兩個人之間有直接的上下級關係,那麼他們中只能有乙個來參加,求請來一部分人之後,搞笑值的最大是多少。樹形dp入門題。dp部分 dp i 0 表示職員i不來參加party,以i為根的子樹的最大搞笑值,...

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