zoukankan      html  css  js  c++  java
  • 树形dp复习 树上依赖背包问题

    选课

    今天又看了一下这道题,竟然AC不了了

    自己的学习效率有点低下

    要明白本质,搞透彻

    #include<bits/stdc++.h>
    #define REP(i, a, b) for(register int i = (a); i < (b); i++)
    #define _for(i, a, b) for(register int i = (a); i <= (b); i++)
    using namespace std;
    
    const int MAXN = 300 + 10;
    struct Edge{ int to, next; };
    Edge e[MAXN << 1];
    int head[MAXN], a[MAXN];
    int f[MAXN][MAXN], tot, n, m;
    
    void AddEdge(int from, int to)
    {
        e[tot] = Edge{to, head[from]};
        head[from] = tot++;
    }
    
    void dfs(int u)
    {
        for(int i = head[u]; ~i; i = e[i].next)
        {
            int v = e[i].to; dfs(v);
            for(int t = m; t >= 1; t--)
                _for(j, 0, t - 1) //注意子树最多选t-1个点 
                    f[u][t] = max(f[u][t], f[u][t-j] + f[v][j]);
        }
    }
    
    int main()
    {
        memset(head, -1, sizeof(head)); tot = 0;
        scanf("%d%d", &n, &m); m++; //这是个技巧,加上选0节点 
        _for(i, 1, n)
        {
            int x; scanf("%d%d", &x, &f[i][1]); //注意这里要初始化 
            AddEdge(x, i);
        }
        
        dfs(0);
        printf("%d
    ", f[0][m]);
        
        return 0;
    }
  • 相关阅读:
    Java堆栈内存总结
    Java String使用总结
    Java异常处理
    音乐之声——midi制作原理
    Windows使用问题总结
    Chrome浏览器的使用
    搭建svn服务器
    Windows实用快捷键
    Phone文件备份
    9大背包第一弹 | 01背包
  • 原文地址:https://www.cnblogs.com/sugewud/p/9831312.html
Copyright © 2011-2022 走看看