ZOJ 3201 Tree of Tree

来源:互联网 发布:mac os x 10.11.6 u盘 编辑:程序博客网 时间:2024/05/17 02:50

Tree of Tree

简单Tree DP. 求一个含有k个节点的子树,使得子树上所有节点的权值和最大。方程:dp[i][j] 表示以i为根的子树中选取j个点所能获得最大值,其中i点必须选,然后就是直接使用分组背包就可以了。

/* *author    : csuchenan *Prog      : ZOJ 3201 *Algorithm : Tree DP dp[i][j] 以i为根 *            的子树中选取j个点的最大值,i点必须选 *Accepted 3201C++0ms224KBchenan*/#include <cstdio>#include <cstring>#include <vector>using std::vector ;#define maxn 105int num[maxn] ;int dp[maxn][maxn]  ;vector<int> G[maxn] ;int n , K ;void init(){    for(int i = 0 ; i <= n ; i ++){        G[i].clear() ;    }    memset(dp , 0 , sizeof(dp)) ;}bool read(){    if(scanf("%d%d" , &n , &K) == EOF)        return 0 ;    init() ;    for(int i = 0 ; i < n ; i ++)        scanf("%d" , &num[i]) ;    int p , q ;    for(int i = 1 ; i < n ; i ++){        scanf("%d%d" , &p , &q) ;        G[p].push_back(q) ;        G[q].push_back(p) ;    }    return 1 ;}int dfs(int v , int f){    int cnt = 1 ;    for(int i = 0 ; i != G[v].size() ; i ++){        int u = G[v][i] ;        if(u == f)            continue ;        cnt += dfs(u , v) ;    }    int tmp = cnt > K ? K : cnt ;    for(int i = 0 ; i != G[v].size() ; i ++){        int u = G[v][i] ;        if(u == f)            continue ;        for(int j = tmp ; j >= 1 ; j --){            for(int t = 1 ; t < j ; t ++){                if(dp[v][j] < dp[v][j - t] + dp[u][t]){                    dp[v][j] = dp[v][j - t] + dp[u][t] ;                }            }        }    }    for(int t = 1 ; t <= tmp ; t ++){        dp[v][t] += num[v] ;    }    return cnt ;}void solve(){    int ans = 0 ;    dfs(0 , -1) ;    for(int i = 0 ; i < n ; i ++){        ans = ans > dp[i][K] ? ans : dp[i][K] ;    }    printf("%d\n" , ans);}int main(){    while(read()){        solve() ;    }    return 0 ;}



原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 睡觉时舍友说话怎么办 夜晚醒了睡不着怎么办 夜晚怕黑睡不着怎么办 宝宝不愿意盖被子怎么办 白天睡觉晚上睡不着怎么办 晚上睡觉不安神怎么办 晚上经常睡不着觉怎么办 老是睡不着觉怎么办啊 小孩睡觉不安稳怎么办 睡觉时动不了怎么办 特别累还睡不着怎么办 又累又睡不着怎么办 干活累的睡不着怎么办 狗一有动静就叫怎么办 楼上天天闹动静怎么办 喝了奶茶失眠怎么办 失眠一宿第二天怎么办 睡觉外面噪音大怎么办 怀孕早期晚上睡不着怎么办 短发发尾翘怎么办 很累就是睡不着怎么办 人累但是睡不着怎么办 如果晚上睡不着该怎么办 晚上睡不着觉该怎么办 晚上睡不着该怎么办呢 晚上失眠睡不着该怎么办 晚上一直睡不着该怎么办 怀孕晚上睡不着该怎么办 运动太累睡不着怎么办 运动完睡不着觉怎么办 晚上冷得睡不着怎么办 晚上脚冷睡不着怎么办 短发头发有点乱怎么办 不想让别人睡觉怎么办 15岁晚上睡不着怎么办 16岁青少年失眠怎么办 好累又睡不着怎么办 造口患者拉肚子怎么办? 起床后头发乱怎么办 新生儿睡觉偏头怎么办 婴儿睡觉偏头怎么办