博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hdu 1011 Starship Troopers 树形dp
阅读量:4970 次
发布时间:2019-06-12

本文共 1490 字,大约阅读时间需要 4 分钟。

又是一道树状dp题目,感觉好难,看的网上的解析才做出来,不过比第一次遇到这种题目时要好多了,加油,多遇到几次就会了。

 

 

 

代码:

#include 
#include
#include
using namespace std;const int MAX = 105;int dp[MAX][MAX];int bug[MAX], brain[MAX];int n, m;int vis[MAX]; vector
tree[MAX]; //图 void dfs(int root);int main(){// freopen("input.txt", "r", stdin); while(cin >> n >> m && n != -1){ for(int i=1; i<=n; i++){ cin >> bug[i] >> brain[i]; bug[i] = (bug[i] + 19) / 20; //转化为需要消耗多少战士,向上取整 tree[i].clear(); } for(int i=1; i
> u >> v; tree[u].push_back(v); tree[v].push_back(u); } if(m == 0){ cout << 0 << endl; continue; } memset(vis, 0, sizeof(vis)); memset(dp, 0, sizeof(dp)); dfs(1); cout << dp[1][m] << endl; } return 0;} void dfs(int root){ vis[root] = 1; if(m < bug[root]) return; for(int i=bug[root]; i<=m; i++){ dp[root][i] = brain[root]; //当军队数大于等于bug[root],则至少可以获取到 brain [root] 的大脑 } for(int i=0; i
=bug[root]; j--){ //背包容量为 j 时 for(int k=j-1; k>=bug[root]; k--){ //root 这颗树 k 个战士 //如果放第 i 棵子树,则脑量等于包括root和前面 i-1 棵子树 k 个战士获取的最大脑量加上第 i 棵子树能获取的最大脑量 dp[root][j] = max(dp[root][j], dp[root][k] + dp[v][j-k]); } } }}

 

转载于:https://www.cnblogs.com/lighter-blog/p/7256765.html

你可能感兴趣的文章
【codeforces 767A】Snacktower
查看>>
【MemSQL Start[c]UP 3.0 - Round 1 C】 Pie Rules
查看>>
Ognl中“%”、“#”、“$”详解
查看>>
我对应用软件——美团的看法
查看>>
执行了的程序,才是你的程序.
查看>>
struts2.x + Tiles2.x读取多个xml 配置文件
查看>>
表单校验之datatype
查看>>
python第六篇文件处理类型
查看>>
ubuntu16系统磁盘空间/dev/vda1占用满的问题
查看>>
grid网格布局
查看>>
JSP常用标签
查看>>
九涯的第一次
查看>>
处理器管理与进程调度
查看>>
向量非零元素个数_向量范数详解+代码实现
查看>>
java if 用法详解_Java编程中的条件判断之if语句的用法详解
查看>>
matlab sin函数 fft,matlab的fft函数的使用教程
查看>>
mysql adddate()函数
查看>>
mysql sin() 函数
查看>>
mysql upper() 函数
查看>>
单片机复位电路
查看>>