zoukankan      html  css  js  c++  java
  • HDU1520 Anniversary party(树形DP)

    题目链接

    题意:

    给定义个多叉树,每个结点上都有一个权值。子结点和父结点不能同时选。求最大的权值和。

    分析:

    利用左儿子右兄弟原则转化成二叉树,DP。

    代码如下:

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <cstdlib>
    
    using namespace std;
    
    const int maxn = 6000 + 10;
    
    struct Tree {
        int father, child, brother;
        int Take, Not;
    
        void init() {
            father = child = brother = Not = 0;
        }
    }tree[maxn];
    
    void dfs(int idx) {
        int child = tree[idx].child;
        while(child) {
            dfs(child);
            tree[idx].Take += tree[child].Not;
            tree[idx].Not += max(tree[child].Take, tree[child].Not);
            child = tree[child].brother;
        }
    }
    
    int main(){
        int n, x;
        while(scanf("%d", &n) == 1) {
            for(int i=1; i<=n; i++) {
                scanf("%d", &x);
                tree[i].init();
                tree[i].Take = x;
            }
    
            int L, K;
            while(scanf("%d%d", &L, &K) == 2) {
                if(L == 0 && K == 0) break;
                tree[L].father = K;
                tree[L].brother = tree[K].child;
                tree[K].child = L;
            }
    
            for(int i=1; i<=n; i++) {
                if(!tree[i].father) {
                    dfs(i);
                    printf("%d\n", max(tree[i].Take, tree[i].Not));
                    break;
                }
            }
        }
    
        return 0;
    }
  • 相关阅读:
    Java程序设计作业02
    Java程序设计作业01
    DS博客作业05
    DS博客作业04
    DS博客作业03
    DS博客作业02
    DS博客作业01
    C博客作业06
    C博客作业05
    C语言——数组作业批改
  • 原文地址:https://www.cnblogs.com/tanhehe/p/3132521.html
Copyright © 2011-2022 走看看