hdu 1011 Starship Troopers(树形DP入门)
Starship Troopers
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 17498 Accepted Submission(s): 4644
To kill all the bugs is always easier than to capture their brains. A map is drawn for you, with all the rooms marked by the amount of bugs inside, and the possibility of containing a brain. The cavern's structure is like a tree in such a way that there is one unique path leading to each room from the entrance. To finish the battle as soon as possible, you do not want to wait for the troopers to clear a room before advancing to the next one, instead you have to leave some troopers at each room passed to fight all the bugs inside. The troopers never re-enter a room where they have visited before.
A starship trooper can fight against 20 bugs. Since you do not have enough troopers, you can only take some of the rooms and let the nerve gas do the rest of the job. At the mean time, you should maximize the possibility of capturing a brain. To simplify the problem, just maximize the sum of all the possibilities of containing brains for the taken rooms. Making such a plan is a difficult job. You need the help of a computer.
The last test case is followed by two -1's.
50 10
40 10
40 20
65 30
70 30
1 2
1 3
2 4
2 5
1 1
20 7
-1 -1
7
- /*
- 这个必须要用无向图,重判的时候用visit数组标记
- */
- #include<stdio.h>
- #include<iostream>
- #include<string.h>
- #include<vector>
- #define N 110
- using namespace std;
- int n,m;
- vector<int> v[N];//用来存放数的
- int dp[N][N];//dp[i][j]表示在第i个结点的时候,用j个士兵能获得多少幽灵
- int f[N];//用来找树根的
- bool visit[N];//记录当前结点走没走过
- struct node
- {
- int p,q;//妖怪的数量,想要的有幽灵的数量
- }fr[N];
- void dfs(int root)
- {
- visit[root]=true;
- int num=(fr[root].p+)/;//当前房间最少需要
- for(int i=num;i<=m;i++)
- dp[root][i]=fr[root].q;//只要是超过了num个士兵都是q个人
- //cout<<num<<endl;
- for(int i=;i<v[root].size();i++)
- {
- int next=v[root][i];//下一个房间
- //cout<<"next="<<next<<endl;
- //cout<<"visit[next]="<<visit[next]<<endl;
- if(visit[next])
- {
- //cout<<"visit[next]="<<visit[next]<<endl;
- continue;//下一步走过了就跳过
- }
- dfs(next);
- //cout<<"ok"<<endl;
- //对dp数组进行初始化
- for(int j=m;j>=num;j--)//背包枚举(01背包嘛从后往前枚举)
- {
- for(int k=;k+j<=m;k++)
- {
- if(dp[next][k])
- dp[root][j+k]=max(dp[root][j+k],dp[root][j]+dp[next][k]);//用j+k些士兵在当前房间,当前房间用j个士兵下一个房间用k个士兵,这两者哪一个大
- }
- }
- }
- }
- int main()
- {
- //freopen("in.txt","r",stdin);
- while(scanf("%d%d",&n,&m)!=EOF)
- {
- if(n==-&&m==-)
- break;
- memset(visit,false,sizeof visit);
- memset(dp,,sizeof dp);
- v[].clear();
- for(int i=;i<=n;i++)
- {
- scanf("%d%d",&fr[i].p,&fr[i].q);
- //cout<<fr[i].p<<" "<<fr[i].q<<endl;
- //f[i]=i;
- v[i].clear();
- }
- v[n+].clear();
- int a,b;
- for(int i=;i<n;i++)
- {
- scanf("%d%d",&a,&b);
- //cout<<a<<" "<<b<<endl;
- v[a].push_back(b);
- v[b].push_back(a);
- f[b]=a;
- }
- //for(int i=1;i<=n;i++)
- // cout<<"i="<<i<<" "<<v[i].size()<<endl;
- if(m==)
- {
- printf("0\n");
- }
- else
- {
- //int root=1;
- //while(root!=f[root]) root=f[root];//找根
- //cout<<"root="<<root<<endl;
- dfs();
- printf("%d\n",dp[][m]);
- }
- }
- return ;
- }
hdu 1011 Starship Troopers(树形DP入门)的更多相关文章
- HDU 1011 Starship Troopers 树形DP 有坑点
本来是一道很水的树形DP题 设dp[i][j]表示,带着j个人去攻打以节点i为根的子树的最大收益 结果wa了一整晚 原因: 坑点1: 即使这个节点里面没有守卫,你如果想获得这个节点的收益,你还是必须派 ...
- [HDU 1011] Starship Troopers (树形dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1011 dp[u][i]为以u为根节点的,花了不超过i元钱能够得到的最大价值 因为题目里说要访问子节点必 ...
- hdu 1011 Starship Troopers 树形背包dp
Starship Troopers Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- hdu 1011 Starship Troopers(树形背包)
Starship Troopers Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- HDU 1011 Starship Troopers 树形+背包dp
http://acm.hdu.edu.cn/showproblem.php?pid=1011 题意:每个节点有两个值bug和brain,当清扫该节点的所有bug时就得到brain值,只有当父节点被 ...
- HDU 1011 Starship Troopers (树dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1011 题意: 题目大意是有n个房间组成一棵树,你有m个士兵,从1号房间开始让士兵向相邻的房间出发,每个 ...
- HDU 1011 Starship Troopers【树形DP/有依赖的01背包】
You, the leader of Starship Troopers, are sent to destroy a base of the bugs. The base is built unde ...
- hdu 1011 Starship Troopers 经典的树形DP ****
Starship Troopers Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- hdu 1011(Starship Troopers,树形dp)
Starship Troopers Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
随机推荐
- 基于c编写的关于随机生成四则运算的小程序
基于http://www.cnblogs.com/HAOZHE/p/5276763.html改编写的关于随机生成四则运算的小程序 github源码和工程文件地址:https://github.com/ ...
- [LeetCode] 231 Power of Two && 326 Power of Three && 342 Power of Four
这三道题目都是一个意思,就是判断一个数是否为2/3/4的幂,这几道题里面有通用的方法,也有各自的方法,我会分别讨论讨论. 原题地址:231 Power of Two:https://leetcode. ...
- spring cloud+dotnet core搭建微服务架构:服务发现(二)
前言 上篇文章实际上只讲了服务治理中的服务注册,服务与服务之间如何调用呢?传统的方式,服务A调用服务B,那么服务A访问的是服务B的负载均衡地址,通过负载均衡来指向到服务B的真实地址,上篇文章已经说了这 ...
- tomcat部署项目的一点心得
打包方式 eclipse 右键项目Export 选择WAR file 在选择将打包好的war 包存放的位置 放到tomcat中运行 : 首先将war包fang放到解压的tomcat中的weba ...
- 【Spring】高级装配
前言 前面讲解了bean的核心装配技术,其可应付很多中装配情况,但Spring提供了高级装配技术,以此实现更为高级的bean装配功能. 高级装配 配置profile bean 将所有不同bean定义放 ...
- Prison Break
Prison Break 时间限制: 1 Sec 内存限制: 128 MB提交: 105 解决: 16[提交][状态][讨论版] 题目描述 Scofild又要策划一次越狱行动,和上次一样,他已经掌 ...
- 关于修改extmail附件大小限制的位置
一.修改extmail的webmail.cf文件, SYS_MESSAGE_SIZE_LIMIT = 5242880 注意:以位为单位为5M字节. SYS_MESSAGE_SIZE_LIMIT = x ...
- zabbix部署
zabbix部署 ----2016年年终总结 二 服务器端安装 yum install zabbix-server 客户端安装 yum install zabbix-agent 配置Server ...
- Echarts数据可视化series-effectscatter特效散点图,开发全解+完美注释
全栈工程师开发手册 (作者:栾鹏) Echarts数据可视化开发代码注释全解 Echarts数据可视化开发参数配置全解 6大公共组件详解(点击进入): title详解. tooltip详解.toolb ...
- MYSQL 数据库高频查询语句整理
一查询数值型数据: SELECT * FROM tb_name WHERE sum > 100; 查询谓词:>,=,<,<>,!=,!>,!<,=>,= ...