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;
    }
  • 相关阅读:
    第三章预习
    预习非数值数据的编码方式
    预习原码补码
    第三章——运算方法和运算部件预习
    预习非数值数据的编码方式
    预习原码补码(习题+预习)
    预习非数值数据的编码方式
    预习原码补码
    10.21
    10.7作业
  • 原文地址:https://www.cnblogs.com/tanhehe/p/3132521.html
Copyright © 2011-2022 走看看