hdu 1011 Starship Troopers 树形dp
2017-09-03 23:48
369 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1011
- 题意
- 给 n 个点, m 个士兵
- n 个点由 n-1 条边连接为树
- 根节点为点 1
- 每个点内有 a 个 bugs, b 个brains
- 杀死当前点所有的 bugs 才能获得当前点的 brains
- 杀死所有的 bugs 才能移动到子节点.
- 1 个士兵能杀死 20 个bugs
- 不足 20 个 bugs 也需要 1 个士兵.
分析
dfs 搜索所有点
i 点的最优
dp[i][cost] = max(dp[i][cost], dp[son_of_i][k] + dp[i][cost-k]);
特判士兵数量为 0
2017-09-04
- 题意
- 给 n 个点, m 个士兵
- n 个点由 n-1 条边连接为树
- 根节点为点 1
- 每个点内有 a 个 bugs, b 个brains
- 杀死当前点所有的 bugs 才能获得当前点的 brains
- 杀死所有的 bugs 才能移动到子节点.
- 1 个士兵能杀死 20 个bugs
- 不足 20 个 bugs 也需要 1 个士兵.
分析
dfs 搜索所有点
i 点的最优
dp[i][cost] = max(dp[i][cost], dp[son_of_i][k] + dp[i][cost-k]);
特判士兵数量为 0
#include <stdio.h> #include <iostream> #include <cstring> #include <ctime> #define nr room[now] using namespace std; const int MAX = 111; int n, m, tmp, x, y, mp[MAX][MAX], dp[MAX][MAX]; struct Room { int cost, val; int depth; }room[MAX]; int mmax(int a, int b) { return a > b ? a : b; } void dt(int now, int depth) { for (int i = 1; i <= n; ++i) if (mp[now][i] && (room[i].depth == 0)) { room[i].depth = (depth+1); dt(i, depth+1); } } void getin() { memset (room, 0, sizeof(room)); memset (dp, 0, sizeof(dp)); memset (mp, 0, sizeof(mp)); for (int i = 1; i <= n; ++i) { scanf("%d%d", &tmp, &room[i].val); room[i].cost = (tmp+19)/20; } for (int i = 0; i < n-1; ++i) { scanf("%d%d", &x, &y); mp[x][y] = 1, mp[y][x] = 1; } room[1].depth = 1; dt(1, 1); } int dfs(int now) { for (int i = room[now].cost; i <= m; ++i) dp[now][i] = room[now].val; for (int i = 1; i <= n; ++i) { if (mp[now][i] && room[now].depth < room[i].depth) { dfs(i); for (int j = m; j >= room[now].cost; --j) //此处如果改为 rep(room[now], m, ++) 则wa //重复 dp[now][j-k] 的最优解可能会包含 dp[i][k] //此时 dp[now][j] 可能会利用多次 dp[i][k] for (int k = 1; j-k >= room[now].cost; ++k) { dp[now][j] = mmax(dp[now][j], dp[now][j-k] + dp[i][k]); } } } return dp[now][m]; } int main() { // freopen("in.t", "r", stdin); // freopen("out.t", "w", stdout); while (scanf("%d%d", &n, &m) == 2 && (n != -1 && m != -1)) { getin(); if (m == 0) { puts("0"); continue; } dfs(1); printf("%d\n", dp[1][m]); } return 0; } /** 判断是否为其子节点而不是其父节点的时候使用了depth 不可否认写挫了 **/
2017-09-04
相关文章推荐
- 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)
- HDU 1011 Starship Troopers 树形DP(0-1背包)
- hdu_1011_Starship Troopers(树形DP)
- hdu 1011 Starship Troopers(树形DP)
- HDU 1011 Starship Troopers - 01树形dp 有坑啊!!
- hdu 1011(树形dp)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入门)
- Starship Troopers(HDU 1011 树形DP)
- hdu-1011- Starship Troopers-自由树转二叉树+树形DP
- hdu 1011 Starship Troopers 简单树形DP