题意:

  给定n个定点和m个士兵,n个定点最终构成一棵树,每个定点有一定x个bugs和y个value,每20个bug需要消耗一个士兵,不足20也消耗一个,然后最终收获y个value,只有父节点被占领后子节点才有被占领的可能。

DP状态转移方程:

  dp[p][j]=max(dp[p][j],dp[p][j-k]+dp[t][k]);

看的王大神的代码,DFS写的,先从叶子节点开始向上遍历进行动态规划,自己看了dp方程也没写出来。。

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <vector>
 5 #include <algorithm>
 6 using namespace std;
 7 #define Max 102
 8 struct node
 9 {
10     int bugs,val;
11 }cav[Max];
12 vector<int> node[Max];
13 int n,m;
14 int vis[Max],dp[Max][Max];
15 int a,b;
16 void dfs(int p)
17 {
18     int i,j,k;
19     vis[p]=1;
20     int temp=(cav[p].bugs+19)/20;
21     for(i=temp;i<=m;i++)
22         dp[p][i]=cav[p].val;
23     for(i=0;i<node[p].size();i++)
24     {
25         int t=node[p][i];
26         if(vis[t])
27             continue;
28         dfs(t);
29         for(j=m;j>=temp;j--)            //回溯时完成对该点的动态规划
30             for(k=1;k<=j-temp;k++)
31                 dp[p][j]=max(dp[p][j],dp[p][j-k]+dp[t][k]);        //保证父节点能够占领
32     }
33     return;
34 }
35 int main()
36 {
37     int i,j;
38     freopen("in.txt","r",stdin);
39     while(scanf("%d%d",&n,&m)!=EOF)
40     {
41         if(n==-1&&m==-1)
42             break;
43         memset(vis,0,sizeof(vis));
44         memset(dp,0,sizeof(dp));
45         for(i=0;i<=n;i++)    node[i].clear();
46         for(i=1;i<=n;i++)
47             scanf("%d%d",&cav[i].bugs,&cav[i].val);
48         for(i=0;i<n-1;i++)
49         {
50             scanf("%d%d",&a,&b);
51             node[a].push_back(b);
52             node[b].push_back(a);
53         }
54         if(m==0)
55         {
56             printf("0\n");
57             continue;
58         }
59         dfs(1);
60         printf("%d\n",dp[1][m]);
61     }
62     return 0;
63 }

转载于:https://www.cnblogs.com/a1225234/p/5232271.html

Starship Troopers(HDU 1011 树形DP)相关推荐

  1. hdu 2196 树形dp

    [题意]:给出一棵树, 每条边有一个权值 求离每个节点最远的点的权值和 看这篇题解学会的  http://tech.ddvip.com/2013-09/1379006959202653.html 树形 ...

  2. hdu 1520 树形dp

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 #include<cstdio> #include<cstring> # ...

  3. hdu 5148 树形dp,分组背包

    题目: 题目分析: 状态方程: dp[当前节点的标号][当前已经选取的城市数] 设已经选取的城市数是K 初始状态: dp[u][0] = dp[u][1] = 0 , 其他的将值设置为无穷大 树形转移 ...

  4. hdu 5148Cities 树形dp

    //dp[u][k1]=min(dp[u][k1-k2]+dp[v][k2]+edge*k2*(k-k2)) //dp[u][k]表示以u节点为根节点的子树中选k个节点所得的最优解 #include& ...

  5. 树形DP——HDU 1011 Starship Troopers

    HDU 1011 Starship Troopers 题目 http://acm.hdu.edu.cn/showproblem.php?pid=1011 作为星河战队的领导者,你被派去摧毁这些虫子的基 ...

  6. HDU 1011 Starship Troopers星河战队(树形dp)

    题意 有n个洞穴编号为1-n,洞穴间有通道,形成了一个n-1条边的树, 洞穴的入口即根节点是1. 每个洞穴有x只bugs,并有价值y的金子,全部消灭完一个洞穴的虫子,就可以获得这个洞穴的y个金子. 现 ...

  7. HDU Starship Troopers (树形DP)

    Starship Troopers Time Limit : 10000/5000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) ...

  8. hdu 1520 Anniversary party(第一道树形dp)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1520 Anniversary party Time Limit: 2000/1000 MS (Java ...

  9. fwt优化+树形DP HDU 5909

    1 //fwt优化+树形DP HDU 5909 2 //见官方题解 3 // BestCoder Round #88 http://bestcoder.hdu.edu.cn/ 4 5 #include ...

最新文章

  1. Web服务器和应用程序服务器有什么区别
  2. WCF+Silverlight部署本机备忘
  3. 如何成为一名专家级的开发人员
  4. 参数估计:最大似然、贝叶斯与最大后验
  5. go 项目 cmd目录_Golang 项目布局浅析
  6. linux下环境变量PATH的用法
  7. Verilog HDL中阻塞语句和非阻塞语句的区别
  8. 尝试使用Microsoft IE 7.0 Beta 1
  9. 【OO学习】OO第二单元作业总结
  10. [转载] [转载] python反三角函数arctan_Python numpy.arctan() 使用实例
  11. 【分享用于学习C++图像处理的代码示例】框架
  12. c语言求信源的信息熵,第二章-信源与信息熵(三)
  13. c语言mppt例子,mppt太阳能控制器电路原理
  14. 算法图解————K 近邻算法
  15. 计算机硬盘小影响,系统C盘容量太小有哪些危害?又要如何扩容呢?今天再说一遍!...
  16. 机械硬盘4k读写速度_极速鲨课堂43:机械硬盘秒变固态靠谱吗?
  17. 在 Ubuntu 18.04 下安装 Klee 2.2
  18. 预备篇 I :范畴与函子
  19. 【stm32】ADC的规则通道和注入通道混合使用
  20. pyspider创建淘女郎图片爬虫任务-运行流程解析

热门文章

  1. 白帽子讲Web安全(对看书之后的一点笔记)
  2. UnityGI2:Lightmaps
  3. Unity3D之UGUI基础7:Scrollbar卷动条
  4. 链表+启发式合并(bzoj 1483: [HNOI2009]梦幻布丁)
  5. 一篇让你看懂卷积神经网络
  6. airflow部署和使用示例
  7. java中生成pdf,插入图片,页眉、页脚、表格
  8. caffe将图像数据转换成lmdb文件
  9. LaTex中“图片引用失败,显示(??)”的解决办法
  10. 贺利坚老师汇编课程47笔记:jmp short和jmp near ptr和jmp far ptr