HDU 1011 Starship Troopers 树状dp+dp背包
来源:互联网 发布:餐饮股份怎么算法 编辑:程序博客网 时间:2024/06/15 17:51
大概意思是:有N个洞,M个士兵,每个洞中有a个bug,b个brain,每个士兵可以最多Kill掉20个bug,入口在洞口1处,问可以得到多少个brain。
在每个节点进行一下背包dp,也就是个树状dp+dp背包,算数每个节点在一定数量的士兵的情况下所获得的最大的宝藏数。
for(k = last; k >= o; k--) for(h = o; h < k; h++) dp[i][k] = max(dp[i][k],dp[g][k - h] + dp[i][h]);状态转移方程就是这个样子,算是比较简单的01背包吧,吧不过也想了好久~~囧~~~
还有就是这个图给出的时候好像只是隔了边,并没有告诉我们谁是父谁是子,好在根节点是知道的,因而需要这样记录
for(i = 1; i < n; i++) { scanf("%d%d",&k,&l); son[k].push_back(l); son[l].push_back(k); }
废话不多说代码如下
#include <iostream>#include <cstring>#include <cstdlib>#include <cmath>#include <vector>#include <functional>#include <cstdio>#include <queue>#include <map>#include <algorithm>#include <stack>#include <utility>typedef long long ll;using namespace std;const int mx = 104;int val[mx],dp[mx][mx],pay[mx];vector <int> son[mx];int n,m;void dfs(int i,int last){ int k,g,j,h; if(last * 20 < pay[i]) return; int o = (pay[i] + 19)/20; pay[i] = -1; for(k = o; k <= last; k++) dp[i][k] = val[i]; for(j = 0; j < son[i].size(); j++) { g = son[i][j]; if(pay[g] == -1) continue; dfs(g,last - o); for(k = last; k >= o; k--) for(h = o; h < k; h++) dp[i][k] = max(dp[i][k],dp[g][k - h] + dp[i][h]); }}int main (){ int i,k,l,g; while (scanf("%d%d",&n,&m)&&(n != -1 ||m != -1)) { g = 0; memset(dp,0,sizeof(dp)); for(i = 1; i <= n; i++) son[i].clear(); for(i = 1; i <= n; i++) scanf("%d%d",&pay[i],&val[i]); for(i = 1; i < n; i++) { scanf("%d%d",&k,&l); son[k].push_back(l); son[l].push_back(k); } dfs(1,m); if(m == 0) printf("0\n"); else printf("%d\n",dp[1][m]); }}
0 0
- HDU 1011 Starship Troopers(树状背包dp)
- HDU 1011 Starship Troopers 树状dp+dp背包
- HDU 1011 Starship Troopers 树状DP
- 树状DP- hdu 1011 Starship Troopers
- hdu-1011-Starship Troopers-树状dp-java
- HDU 1011 Starship Troopers (树形DP+背包)
- 【树形DP(背包)】 HDU 1011 Starship Troopers
- hdu 1011 Starship Troopers (树形dp+背包)
- HDU 1011 Starship Troopers (树形DP+背包)
- hdu 1011 Starship Troopers DP
- HDU 1011 Starship Troopers (树形DP+依赖背包)
- HDU 1011 Starship Troopers---树形dp+有依赖的背包
- hdu 1011 Starship Troopers (树形背包dp)
- HDU 1011 Starship Troopers 树形DP(0-1背包)
- hdu 1011 Starship Troopers(树形DP+背包问题)
- hdu 1011 Starship Troopers (依赖背包 树形dp)
- HDU 1011 Starship Troopers(树形dp+背包)
- HDU 1011 Starship Troopers(树形DP/01背包)
- 不依赖于Auto-Config文件的代理发现
- WinHTTP的AutoProxy常见问题
- JqueryMobile自定义主题
- Oracle中rownum的用法解析
- ubuntu14.1的图形界面无法配置网络
- HDU 1011 Starship Troopers 树状dp+dp背包
- 数据库索引
- C++散列表二次探测
- oracle中的一些基本概念
- Python学习-共享模块代码
- 欢迎使用CSDN-markdown编辑器
- HDU 1102 Constructing Roads
- JAVA多线程静态同步函数
- JAVA / Android SDK的安装与环境变量配置