zoukankan      html  css  js  c++  java
  • HDU_1520 Anniversary Praty (树型dp)

      /*题意:传说中的Ural神校要搞80周年校庆。学校的员工关系构成一颗树,每个员工有
    个pleasure值,表示参加party的开心程度。每个员工都不想跟自己的顶头上司一起参加
    party。然后校长就想啦,怎么发请柬才能让party最high。

      思路:定义fw[i]表示带上根结点时这颗子树的最大pleasure,fn[i]表示不带根结点时这
    颗子树的最大pleasure。转移方程就是:

    fw[i] = sum(fn[son[i]]);

    fn[i] = sum( max(fn[son[i]], fw[son[i]]) );

    其实很容易实现,画个图一目了然。
    */

    //ps:1Y,^_^

    //My Code:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <vector>

    using namespace std;

    const int N = 6010;

    vector<int> g[N];

    int fw[N], fn[N], p[N];
    bool vis[N];

    void dfs(int r) {
    if(vis[r]) return ;
    vis[r] = true;

    int len = g[r].size();
    if(!len) {
    fn[r] = 0;
    fw[r] = p[r];
    return ;
    }
    int i, c;
    for(i = 0; i < len; i++) {
    c = g[r][i];
    dfs(c);
    fn[r] += max(fn[c], fw[c]);
    fw[r] += fn[c];
    }
    fw[r] += p[r];
    }

    int main() {
    //freopen("data.in", "r", stdin);

    int n, x, y, i, ans;
    while(~scanf("%d", &n)) {
    for(i = 0; i <= n; i++) g[i].clear();

    for(i = 1; i <= n; i++) {
    scanf("%d", p + i);
    }

    while(scanf("%d%d", &x, &y), x || y) {
    g[y].push_back(x);
    }

    memset(fn, 0, sizeof(fn));
    memset(fw, 0, sizeof(fw));
    memset(vis, false, sizeof(vis));

    for(i = 1; i <= n; i++) {
    if(!vis[i]) dfs(i);
    }

    for(ans = 0, i = 1; i <= n; i++) {
    ans = max(ans, max(fw[i], fn[i]));
    }
    printf("%d\n", ans);
    }
    return 0;
    }
  • 相关阅读:
    Eclipse 插件安装、升级和卸载的方法
    Eclipse中Spring插件的安装
    为eclipse离线安装hibernate tools插件
    Eclipse中Hibernate插件的安装
    Nginx安装配置
    app自动更新(android)
    PhoneGap应用图标icon和启动页面SplashScreen
    highcharts图表的图例legend
    安装android的sdk
    设置全屏
  • 原文地址:https://www.cnblogs.com/vongang/p/2316476.html
Copyright © 2011-2022 走看看