zoukankan      html  css  js  c++  java
  • 树形dp入门

    poj2057

    某公司的上下级关系是一颗树状结构,每个人不能与他的上司同时出现,每个人有一个值,求最大值。

    这个题需要注意的是如果不保存状态会超时,这似乎也是大部分dp应该注意的事情啊

    #include<iostream>
    #include<string.h>
    #include<stdio.h>
    #include<vector>
    using namespace std;
    const int maxa = 6005;
    int n;
    vector< int> xiashu[maxa];
    int dp[maxa][2];
    int v[maxa];
    int du[maxa];
    int dfs(int x, int zai){
        int maxn = 0;
        int sum = 0;
        if(dp[x][zai])
            return dp[x][zai];
        for(int i = 0;i < xiashu[x].size(); i++){
            int k = xiashu[x][i];
            sum += dfs(k, 0);
        }
        maxn = sum;
        if(zai)
            return dp[x][zai] = maxn;
        sum = 0;
        for(int i = 0; i < xiashu[x].size(); i++){
            int k = xiashu[x][i];
            sum += dfs(k, 1);
        }
        return dp[x][zai] = max(maxn, sum +v[x]);
    }
    int main(){
        while(scanf("%d", &n)!=EOF){
            for(int i = 1;i  <= n; i++){
                scanf("%d", &v[i]);
            }
            memset(dp, 0, sizeof(dp));
            memset(du, 0, sizeof(du));
            for(int i = 1; i<= n; i++)
                xiashu[i].clear();
            int x, y;
            while(1){
                scanf("%d%d", &x, &y);
                if(!y && !x)
                    break;
                xiashu[y].push_back(x);
                du[x]++;
            }
            for(int i = 1; i <= n; i++){
                if(du[i]==0)
                    printf("%d
    ", dfs(i, 0));
            }
        }
    }
    View Code
  • 相关阅读:
    Nginx 日志切割-定时(附数据库数据备份)
    安装Nginx
    系统自适应限流
    黑名名单控制-sentinel
    热点参数的流量控制
    流量控制文档说明
    在Linux中输入命令时打错并按了enter
    配置maven环境
    项目层次展示
    寻找cmd的管理员运行
  • 原文地址:https://www.cnblogs.com/icodefive/p/4029548.html
Copyright © 2011-2022 走看看