hdu1011 树形dp

来源:互联网 发布:淘宝回购率 编辑:程序博客网 时间:2024/05/16 09:23

题意:有n个洞组成一棵树形结构,你有m个士兵,你从1号房间开始攻打,每个洞有a个bugs和brain的价值。你的一个士兵可以打20个bugs,为了拿到这个洞的价值brain你必须留下k个士兵消灭这个洞的所有bugs(k*20>="bugs"的数量,且留下的士兵不可以再去攻打其他的洞,且必须攻打了前面的洞才可以攻打后面的洞)。问你花费这m个士兵可以得到的最大价值是多少。

思路:树形dp dp[i][j]表示第i个节点安排j个士兵所能取得的最大价值,状态转移方程:

dp[dad][j+k] = max(dp[dad][j+k], dp[dad][j] + dp[son][k]); 其中m = i + j;

ps:提议并未给出明确的谁父谁子,所以建边时 要建双向边。

#include <algorithm>#include <iostream>#include <sstream>#include <cstdlib>#include <cstring>#include <iomanip>#include <cstdio>#include <string>#include <bitset>#include <vector>#include <queue>#include <stack>#include <cmath>#include <list>#include <map>#include <set>#define sss(a,b,c) scanf("%d%d%d",&a,&b,&c)#define mem1(a) memset(a,-1,sizeof(a))#define mem(a) memset(a,0,sizeof(a))#define ss(a,b) scanf("%d%d",&a,&b)#define s(a) scanf("%d",&a)#define INF 0x3f3f3f3f#define w(a) while(a)#define PI acos(-1.0)#define LL long long#define eps 10E-9#define N 100010<<1#define mod 1000000000+7using namespace std;void mys(int& res){    int flag=0;    char ch;    while(!(((ch=getchar())>='0'&&ch<='9')||ch=='-'))        if(ch==EOF)  res=INF;    if(ch=='-')  flag=1;    else if(ch>='0'&&ch<='9')  res=ch-'0';    while((ch=getchar())>='0'&&ch<='9')  res=res*10+ch-'0';    res=flag?-res:res;}void myp(int a){    if(a>9)        myp(a/10);    putchar(a%10+'0');}/*************************THE END OF TEMPLATE************************/struct node {    int bugs;    int brains;    int pos;    int son[101];}info[110];int dp[110][110];bool vis[110];int n, m;void tree_dp(int root){    vis[root] = true;    int cost = (info[root].bugs + 19)/20;    for(int i = cost; i<=m; i++) dp[root][i] = info[root].brains;    for(int i = 0; i<info[root].pos; i++){        int next = info[root].son[i];        if(!vis[next]){            tree_dp(next);            for(int j = m; j>=cost; j--){                for(int k = 1; j+k<=m; k++){                    if(dp[next][k]){//当前情况肯定要在子情况已经明确的情况下决定                        dp[root][j + k] = max(dp[root][j+k], dp[root][j] + dp[next][k]);                    }                }            }        }    }}int main(){    w(~ss(n, m)){        if(n == -1 && m == -1) break;        mem(info);        mem(dp);        mem(vis);        for(int i=1; i<=n; i++) ss(info[i].bugs, info[i].brains);        int x, y;        for(int i = 1; i < n; i++){            ss(x, y);            info[x].son[info[x].pos++] = y;            info[y].son[info[y].pos++] = x;        }        if(!m)  printf("0\n");        else{            tree_dp(1);            printf("%d\n", dp[1][m]);        }    }    return 0;}


1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 家里的钥匙丢了怎么办 lol美服更新慢怎么办 魔域密码忘了怎么办 魔域账号忘记了怎么办 魔域91密码忘了怎么办 魔域人数满了怎么办 部队玩手机被逮怎么办 脑子很笨怎么办17岁 跑步心肺功能差怎么办 剧烈运动后恶心想吐怎么办 运动后头晕想吐怎么办 跑步后反胃想吐怎么办 长跑后恶心想吐怎么办 离职前请假不批怎么办 酷派x7无限重启怎么办 钢铁雄心3资源多怎么办 汽车智能钥匙没电了怎么办 辐射3食物有辐射怎么办 辐射3玩起来很卡怎么办 辐射3多余的瓶盖怎么办 辐射4开锁太快怎么办 极度恐慌3没子弹怎么办 辐射3道德值低怎么办 辐射3任务做完了怎么办 极限竞速6闪退怎么办 两个睾丸都碎了怎么办 快递退回去了钱怎么办 想登录老公微信怎么办 养狗家里味道大怎么办 实在不想养狗了怎么办 培训完不想干了怎么办 干了几天想离职怎么办 药流开始流血了怎么办 药流期间同房了怎么办 想学韩语可是没基础怎么办 鞋子多买了一双怎么办 胳膊抻着了怎么办妙招 胳膊抻筋了 很疼怎么办 干活胳膊抻筋了怎么办 胳膊上的筋扭了怎么办 一岁宝宝脖子歪怎么办