POJ 2342 Anniversary party - (TYVJ p1052 - wikioi 1380 - 动态规划: 树形dp-没有上司的舞会)


动态规划: 树形dp-没有上司的舞会 | yutian's blog
There is going to be a party to celebrate the 80-th Anniversary of the Ural State University. The University has a hierarchical structure of employees. It means that the supervisor relation forms a tree rooted at the rector V. E. Tretyakov. In order to make the party funny for every one, the rector does not want both an employee and his or her immediate supervisor to be present. The personnel office has evaluated conviviality of each employee, so everyone has some number (rating) attached to him or her. Your task is to make a list of guests with the maximal possible sum of guests’ conviviality ratings.
Input
Employees are numbered from 1 to N. A first line of input contains a number N. 1 <= N <= 6 000. Each of the subsequent N lines contains the conviviality rating of the corresponding employee. Conviviality rating is an integer number in a range from -128 to 127. After that go N – 1 lines that describe a supervisor relation tree. Each line of the tree specification has the form:
L K
It means that the K-th employee is an immediate supervisor of the L-th employee. Input is ended with the line
0 0
Output
Output should contain the maximal sum of guests’ ratings.
Ural大学有N个职员,编号为1~N。他们有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司。每个职员有一个快乐指数。现在有个周年庆宴会,要求与会职员的快乐指数最大。但是,没有职员愿和直接上司一起与会。意思是如果某人直接上司去了,那么他就不去。

输入描述

第一行一个整数N。(1<=N<=6000)
接下来N行,第i+1行表示i号职员的快乐指数Ri。(-128<=Ri<=127)
接下来N-1行,每行输入一对整数L,K。表示K是L的直接上司。
最后一行输入0,0。

输出描述

输出最大的快乐指数。

样例输入

7
1
1
1
1
1
1
1
1 3
2 3
6 4
7 4
4 5
3 5
0 0

样例输出

5

思路

设状态f[k][0],表示k不参加舞会时最大的快乐指数,f[k][1]表示k参加舞会时的最大快乐指数
状态转移方程如下:
f[k][0]=max(f[l][0],f[l][1])
f[k][1]=f[l][0]+happy[k]
树形dp的以大特点就是数据是分好几块的,相互之间并不影响,比如说处理左子树和右子树时,两边的数据是不会相互影响的,即只用到了一部分数据。而一般的dp算法都是从0-n一步一步算出来的。
这两道题目可以说一个类型的,都是在树上选取一些结点,以获得最优值,限制条件就是子节点和父节点的关系,二者不可以都选取,或者不可以都不选取,所以代码几乎都一样。  
http://blog.csdn.net/Tc_To_Top/article/details/45021113
对于每个人,都有去和不去两种可能,所以找到根节点,向下处理。
对于每个节点:
 1、如果到场,则在这个点的气氛值 =其所有下属都不到场时的气氛值 +其本身的气氛值。
 2、如果不到场,则在这个点的气氛值=其下属到场(或者不到场,二者取较大值)时的气氛值。
void dp(int k) {
    f[k][1] = happy[k];
    for (int i = 0; i < G[k].size(); i++) {
        int l = G[k][i];
        dp(l);
        f[k][1] += f[l][0];
        f[k][0] += max(f[l][0], f[l][1]);
    }
}

void solve() {
    int i = 0;
    for (i = 1; i <= n; i++) {
        if (!has_boss[i])
            break;
    }
    dp(i);
    cout<<max(f[i][0], f[i][1])<<endl;
}

int main() {
    cin>>n;
    for (int i = 1; i <= n; i++) {
        cin>>happy[i];
    }
    
    int l, k;
    for (int i = 1; i <= n - 1; i++) {
        cin>>l>>k;
        G[k].push_back(l);
        has_boss[l] = 1;
    }
    
    cin>>l>>k;
    
    solve();
}
http://blog.csdn.net/u012350533/article/details/12361895
  1. * 分析:用dp[u][1]表示选第u个人时以u为根的子树的最大欢乐度。dp[u][0]表示不选u。 
  2. * 又上司不能和下属同选,则有 
  3. * dp[u][1]=sigma(dp[v][0])+w[i]{v是u的儿子结点} 
  4.  * dp[u][0]=sigma(max(dp[v][0],dp[v][1])){v是u的子结点} 
  5. * 边界条件:如果i是叶子,则dp[u][0]=0;dp[u][1]=w[i]; 
  6. * 关键:由儿子向父节点转移状态; 
  1. inline void addedge(int u,int v)  
  2. {  
  3.      edge[cnt].v=v;  
  4.      edge[cnt].next=head[u];  
  5.      head[u]=cnt++;  
  6. }  
  7.   
  8. inline void DFS(int u)  
  9. {  
  10.      dp[u][1]=w[u];  
  11.      dp[u][0]=0;  
  12.      for(int i=head[u];i!=-1;i=edge[i].next)  
  13.      {  
  14.          int v=edge[i].v;  
  15.          DFS(v);  
  16.          dp[u][1]=max(dp[u][1],dp[v][0]+dp[u][1]);  
  17.          dp[u][0]=dp[u][0]+max(dp[v][1],dp[v][0]);  
  18.      }  
  19. }  
  20.   
  21. int main()  
  22. {  
  23.     int n;  
  24.      while(scanf("%d",&n)!=EOF)  
  25.      {  
  26.          for(int i=1;i<=n;i++)  
  27.           scanf("%d",&w[i]);  
  28.   
  29.          cnt=0;  
  30.          memset(vis,false,sizeof(vis));  
  31.          memset(head,-1,sizeof(head));  
  32.          int x,y;  
  33.   
  34.          for(int i=1;i<n;i++)  
  35.          {  
  36.              scanf("%d%d",&x,&y);  
  37.              vis[x]=true;  
  38.              addedge(y,x);  
  39.          }  
  40.   
  41.          scanf("%d%d",&x,&y);  
  42.          memset(dp,0,sizeof(dp));  
  43.   
  44.          for(int i=1;i<=n;i++)  
  45.          {  
  46.              if(!vis[i])  
  47.              {  
  48.                  DFS(i);  
  49.                  printf("%d\n",max(dp[i][0],dp[i][1]));  
  50.                  break;  
  51.              }  
  52.          }  
  53.      }  
  54.      return 0;  
  55. }  

http://www.cnblogs.com/qscqesze/p/4134011.html
void dfs(int k)//dfs求解
{
    for(int i=0;i<g[k].size();i++)//搜索每一个子节点
    {
        int h=g[k][i];
        dfs(h);
        f[k][0]+=max(f[h][1],f[h][0]);//去或者不去,0表示不去,1表示去
        f[k][1]+=f[h][0];
    }
    f[k][1]+=a[k];
}

int main()
{
        sspeed;
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    for(int i=1;;i++)
    {
        int x,y;
        cin>>x>>y;
        if(x==0&&y==0)
            break;
        g[y].push_back(x);//表示g[y]的子是什么
        b[x]=y;//表示x的父节点
    }//建树过程,用一个vector建树
    for(int i=1;i<=n;i++)
    {
        if(b[i]==0)//从根开始
        {
            dfs(i);
            cout<<max(f[i][0],f[i][1])<<endl;
        }
    }
    return 0;
}
Read full article from 动态规划: 树形dp-没有上司的舞会 | yutian's blog

Labels

LeetCode (1432) GeeksforGeeks (1122) LeetCode - Review (1067) Review (882) Algorithm (668) to-do (609) Classic Algorithm (270) Google Interview (237) Classic Interview (222) Dynamic Programming (220) DP (186) Bit Algorithms (145) POJ (141) Math (137) Tree (132) LeetCode - Phone (129) EPI (122) Cracking Coding Interview (119) DFS (115) Difficult Algorithm (115) Lintcode (115) Different Solutions (110) Smart Algorithm (104) Binary Search (96) BFS (91) HackerRank (90) Binary Tree (86) Hard (79) Two Pointers (78) Stack (76) Company-Facebook (75) BST (72) Graph Algorithm (72) Time Complexity (69) Greedy Algorithm (68) Interval (63) Company - Google (62) Geometry Algorithm (61) Interview Corner (61) LeetCode - Extended (61) Union-Find (60) Trie (58) Advanced Data Structure (56) List (56) Priority Queue (53) Codility (52) ComProGuide (50) LeetCode Hard (50) Matrix (50) Bisection (48) Segment Tree (48) Sliding Window (48) USACO (46) Space Optimization (45) Company-Airbnb (41) Greedy (41) Mathematical Algorithm (41) Tree - Post-Order (41) ACM-ICPC (40) Algorithm Interview (40) Data Structure Design (40) Graph (40) Backtracking (39) Data Structure (39) Jobdu (39) Random (39) Codeforces (38) Knapsack (38) LeetCode - DP (38) Recursive Algorithm (38) String Algorithm (38) TopCoder (38) Sort (37) Introduction to Algorithms (36) Pre-Sort (36) Beauty of Programming (35) Must Known (34) Binary Search Tree (33) Follow Up (33) prismoskills (33) Palindrome (32) Permutation (31) Array (30) Google Code Jam (30) HDU (30) Array O(N) (29) Logic Thinking (29) Monotonic Stack (29) Puzzles (29) Code - Detail (27) Company-Zenefits (27) Microsoft 100 - July (27) Queue (27) Binary Indexed Trees (26) TreeMap (26) to-do-must (26) 1point3acres (25) GeeksQuiz (25) Merge Sort (25) Reverse Thinking (25) hihocoder (25) Company - LinkedIn (24) Hash (24) High Frequency (24) Summary (24) Divide and Conquer (23) Proof (23) Game Theory (22) Topological Sort (22) Lintcode - Review (21) Tree - Modification (21) Algorithm Game (20) CareerCup (20) Company - Twitter (20) DFS + Review (20) DP - Relation (20) Brain Teaser (19) DP - Tree (19) Left and Right Array (19) O(N) (19) Sweep Line (19) UVA (19) DP - Bit Masking (18) LeetCode - Thinking (18) KMP (17) LeetCode - TODO (17) Probabilities (17) Simulation (17) String Search (17) Codercareer (16) Company-Uber (16) Iterator (16) Number (16) O(1) Space (16) Shortest Path (16) itint5 (16) DFS+Cache (15) Dijkstra (15) Euclidean GCD (15) Heap (15) LeetCode - Hard (15) Majority (15) Number Theory (15) Rolling Hash (15) Tree Traversal (15) Brute Force (14) Bucket Sort (14) DP - Knapsack (14) DP - Probability (14) Difficult (14) Fast Power Algorithm (14) Pattern (14) Prefix Sum (14) TreeSet (14) Algorithm Videos (13) Amazon Interview (13) Basic Algorithm (13) Codechef (13) Combination (13) Computational Geometry (13) DP - Digit (13) LCA (13) LeetCode - DFS (13) Linked List (13) Long Increasing Sequence(LIS) (13) Math-Divisible (13) Reservoir Sampling (13) mitbbs (13) Algorithm - How To (12) Company - Microsoft (12) DP - Interval (12) DP - Multiple Relation (12) DP - Relation Optimization (12) LeetCode - Classic (12) Level Order Traversal (12) Prime (12) Pruning (12) Reconstruct Tree (12) Thinking (12) X Sum (12) AOJ (11) Bit Mask (11) Company-Snapchat (11) DP - Space Optimization (11) Dequeue (11) Graph DFS (11) MinMax (11) Miscs (11) Princeton (11) Quick Sort (11) Stack - Tree (11) 尺取法 (11) 挑战程序设计竞赛 (11) Coin Change (10) DFS+Backtracking (10) Facebook Hacker Cup (10) Fast Slow Pointers (10) HackerRank Easy (10) Interval Tree (10) Limited Range (10) Matrix - Traverse (10) Monotone Queue (10) SPOJ (10) Starting Point (10) States (10) Stock (10) Theory (10) Tutorialhorizon (10) Kadane - Extended (9) Mathblog (9) Max-Min Flow (9) Maze (9) Median (9) O(32N) (9) Quick Select (9) Stack Overflow (9) System Design (9) Tree - Conversion (9) Use XOR (9) Book Notes (8) Company-Amazon (8) DFS+BFS (8) DP - States (8) Expression (8) Longest Common Subsequence(LCS) (8) One Pass (8) Quadtrees (8) Traversal Once (8) Trie - Suffix (8) 穷竭搜索 (8) Algorithm Problem List (7) All Sub (7) Catalan Number (7) Cycle (7) DP - Cases (7) Facebook Interview (7) Fibonacci Numbers (7) Flood fill (7) Game Nim (7) Graph BFS (7) HackerRank Difficult (7) Hackerearth (7) Inversion (7) Kadane’s Algorithm (7) Manacher (7) Morris Traversal (7) Multiple Data Structures (7) Normalized Key (7) O(XN) (7) Radix Sort (7) Recursion (7) Sampling (7) Suffix Array (7) Tech-Queries (7) Tree - Serialization (7) Tree DP (7) Trie - Bit (7) 蓝桥杯 (7) Algorithm - Brain Teaser (6) BFS - Priority Queue (6) BFS - Unusual (6) Classic Data Structure Impl (6) DP - 2D (6) DP - Monotone Queue (6) DP - Unusual (6) DP-Space Optimization (6) Dutch Flag (6) How To (6) Interviewstreet (6) Knapsack - MultiplePack (6) Local MinMax (6) MST (6) Minimum Spanning Tree (6) Number - Reach (6) Parentheses (6) Pre-Sum (6) Probability (6) Programming Pearls (6) Rabin-Karp (6) Reverse (6) Scan from right (6) Schedule (6) Stream (6) Subset Sum (6) TSP (6) Xpost (6) n00tc0d3r (6) reddit (6) AI (5) Abbreviation (5) Anagram (5) Art Of Programming-July (5) Assumption (5) Bellman Ford (5) Big Data (5) Code - Solid (5) Code Kata (5) Codility-lessons (5) Coding (5) Company - WMware (5) Convex Hull (5) Crazyforcode (5) DFS - Multiple (5) DFS+DP (5) DP - Multi-Dimension (5) DP-Multiple Relation (5) Eulerian Cycle (5) Graph - Unusual (5) Graph Cycle (5) Hash Strategy (5) Immutability (5) Java (5) LogN (5) Manhattan Distance (5) Matrix Chain Multiplication (5) N Queens (5) Pre-Sort: Index (5) Quick Partition (5) Quora (5) Randomized Algorithms (5) Resources (5) Robot (5) SPFA(Shortest Path Faster Algorithm) (5) Shuffle (5) Sieve of Eratosthenes (5) Strongly Connected Components (5) Subarray Sum (5) Sudoku (5) Suffix Tree (5) Swap (5) Threaded (5) Tree - Creation (5) Warshall Floyd (5) Word Search (5) jiuzhang (5)

Popular Posts