題目大意:給定一棵關係樹,每個節點有個權值,子節點和父節點不能同時選,問最後能選的最大價值是多少?
解題思路:樹形dp入門題。由於子節點與父節點不能同時選,有人可能會用貪心思想,二者選其一肯定最優。其實不然,有可能父節點和子節點都不選,而要選子孫節點。不過只要再往深點想下,就可以得出動態規劃的解法。每個節點要麼選要麼不選,和大多數選不選動歸一樣,來個dp[i][2],0表示不選,1表示不選,那我們只要從葉子節點往根結點不斷更新dp[i][0]和dp[i][1]就可以了。
狀態轉移方程:dp[i[[1] = sum(dp[j][0]) + 當前節點 (當前選了,子節點必定不能選,最優的情況是都不選,然後累加)
dp[i][0] = sum(max(dp[i][0],dp[i][1])) (當選不選,子節點可選可不選,找大的那個狀態)
測試資料:
110 0711
1111
11 3
2 36 4
7 44 5
3 50 0
#include #include #define max 20000
#define max(a,b) (a)>(b)?(a):(b)
struct node *head[max],tree[max];
int n,ptr,dp[max][2];
int vis[max],num[max];
void initial()
void addedge(int x,int y)
void tree_dp(int v)
p = p->next;
}dp[v][1] += num[v];
}int main()
return 0;
}
HDU1520 樹形dp入門)
解題思路 設dp i 0 表示 當前這個點不選,dp i 1 表示當前這個點選擇的最優解。轉移方程 dp cur 0 max dp son 1 dp son 0 當前這個點不選,那他的孩子可選可不選,取 最大的。dp cur 1 dp son 0 當前這點選擇,那他的孩子就不能選擇。include ...
hdu1520樹形dp入門
題目鏈結 題意 要開派對,邀請了上司就不能邀請他的下屬,邀請了下屬就不能邀請他的上司,每個人有乙個值,求邀請的人的總值最大 第一行給出乙個數n,代表有n個人。下面n行分別給出n個人的的值 再下面n行每行給出l,k k是l的上司 以0 0結束一組輸入 樹形dp 把每個人看成乙個點,則該點有兩個狀態 邀...
HDU1520(樹形dp入門題)
題意 在乙個有根樹上每個節點有乙個權值,每相鄰的父親和孩子只能選擇乙個,問怎麼選擇總權值之和最大。思路 樹形dp的常規入門題 設dp i 0 表示 當前這個點不選,dp i 1 表示當前這個點選擇的最優解。轉移方程 dp cur 0 max dp son 1 dp son 0 當前這個點不選,那他的...