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