做的第一道树形背包,应该算是入门题。

给定n个国家,相互间有统治附属关系,可以贿赂m个国家,贿赂某个国家同时其附属国也被直接贿赂。

思路:按附属关系连有向边,将其变成一棵树,于是就成了一棵树上的01背包。找到度数为1的节点开始dfs,dfs到某个国家时,先深搜其附属国,完成其附属国的DP,最后再到自己。

代码:

// Header.
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <string>
#include <bitset>
#include <queue>
#include <stack>
#include <cmath>
#include <ctime>
#include <set>
#include <map>
using namespace std;// Macro
typedef long long LL;
#define TIME cerr << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << "s." << endl;
#define IN freopen("/Users/apple/input.txt", "r", stdin);
#define OUT freopen("/Users/apple/out.txt", "w", stdout);
#define mem(a, n) memset(a, n, sizeof(a))
#define rep(i, n) for(int i = 0; i < (n); i ++)
#define REP(i, t, n) for(int i = (t); i < (n); i ++)
#define FOR(i, t, n) for(int i = (t); i <= (n); i ++)
#define ALL(v) v.begin(), v.end()
#define Min(a, b) a = min(a, b)
#define Max(a, b) a = max(a, b)
#define put(a) printf("%d\n", a)
#define ss(a) scanf("%s", a)
#define si(a) scanf("%d", &a)
#define sii(a, b) scanf("%d%d", &a, &b)
#define siii(a, b, c) scanf("%d%d%d", &a, &b, &c)
#define VI vector<int>
#define pb push_back
const int inf = 0x3f3f3f3f, N = 2e2 + 5, MOD = 1e9 + 7;
// Macro endint T, cas = 0;
int n, m;
char input[10];
map<string, int > mp;
int dp[2*N], cnt[N], in[N], w[N], head[N], ne;
struct node {int v, nxt;
}e[N * N];
// Imp
void addEdge(int u, int v) {e[ne].v = v; e[ne].nxt = head[u]; head[u] =ne ++;
}void dfs(int u) {int tmp[2*N];cnt[u] = 1;memcpy(tmp, dp, sizeof(dp));for(int i = head[u]; i != -1; i = e[i].nxt) {int v = e[i].v;dfs(v);cnt[u] += cnt[v];}for(int i = m + cnt[u]; i >= cnt[u]; i --) {Min(tmp[i], tmp[i-cnt[u]] + w[u]);Min(dp[i], tmp[i]);}
}int main(){
#ifdef LOCALIN // OUT
#endifwhile(gets(input)) {if(input[0] == '#') break;stringstream inp(input);inp >> n, inp >> m;mp.clear();mem(dp, 0x3f);mem(cnt, 0);mem(in, 0);mem(head, -1);mem(w, 0);ne = 0;int tot = 0;FOR(i, 1, n) {string s;int t;getline(cin, s);stringstream ss;ss << s;ss >> s; ss >> t;if(!mp[s]) mp[s] = ++ tot;w[mp[s]] = t;int u = mp[s];while(1) {string str;ss >> str;if(ss.fail()) break;int k = mp[str];if(!k) {mp[str] = ++ tot;k = tot;}addEdge(u, mp[str]);in[k] ++;}ss.str("");} dp[0] = 0;FOR(i, 1, n) if(!in[i]) dfs(i);int ans = inf;FOR(i, m, 2 * n) Min(ans, dp[i]);put(ans);}return 0;
}

HDU 2415 Bribing FIPA(树形背包)相关推荐

  1. HDU 1011 Starship Troopers 树形+背包dp

    http://acm.hdu.edu.cn/showproblem.php?pid=1011   题意:每个节点有两个值bug和brain,当清扫该节点的所有bug时就得到brain值,只有当父节点被 ...

  2. HDU 1011-Starship Troopers(树形背包)

    题意: 有n个洞,连接像一棵树,每个包含一定数量的怪和价值,给你m个士兵,每个士兵能打20个怪,杀完一个洞的怪可得该洞的价值才可继续打相连的下面的洞(每个士兵只能打一个洞),求获得的最大价值. 分析: ...

  3. HDU 4276 The Ghost Blows Light 最短路+树形背包

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4276 目录 题意 分析 Code 题意 有一棵树,每个节点都有财富wi,每条边都会花费ci的时间,问你 ...

  4. HDU 1248 寒冰王座(全然背包:入门题)

    HDU 1248 寒冰王座(全然背包:入门题) http://acm.hdu.edu.cn/showproblem.php?pid=1248 题意: 不死族的巫妖王发工资拉,死亡骑士拿到一张N元的钞票 ...

  5. 【每日DP】day 8、P2014 [CTSC1997]选课(树形DP(树形背包)模板)难度⭐⭐⭐

    P2014 [CTSC1997]选课 题意为选一门课前要看它是否有前提条件:即选了一门主课才能选 "副科",所以可以树形背包来做. 注意是不能用分组背包来做,因为这道题附件有很多个 ...

  6. [Jsoi2016]最佳团体 BZOJ4753 01分数规划+树形背包/dfs序

    分析: 化简一下我们可以发现,suma*ans=sumb,那么我们考虑二分ans,之后做树形背包上做剪枝. 时间复杂度证明,By GXZlegend O(nklogans) 附上代码: #includ ...

  7. [HAOI2015]树上染色(树形dp,树形背包)

    链接:https://ac.nowcoder.com/acm/problem/19996 来源:牛客网 题目描述 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个 ...

  8. P4322-[JSOI2016]最佳团体【0/1分数规划,树形背包】

    正题 题目链接:https://www.luogu.com.cn/problem/P4322 题目大意 nnn个点的一棵树,每个节点有一个(si,pi)(s_i,p_i)(si​,pi​),选择一个点 ...

  9. *多叉树的树形背包常见建模方法

    一.多叉树变二叉树. 这个技巧其实也有两种具体的方法:树的孩子兄弟表示法与dfs序法. 1.树的孩子兄弟表示法. 大家在学习树形结构时一定接触了一个多叉树变二叉树的方法,就是把每个点与它的第一个儿子连 ...

  10. 【bzoj4007】[JLOI2015]战争调度 暴力+树形背包dp

    题目描述 给你一棵 $n$ 层的完全二叉树,每个节点可以染黑白两种颜色.对于每个叶子节点及其某个祖先节点,如果它们均为黑色则有一个贡献值,如果均为白色则有另一个贡献值.要求黑色的叶子节点数目不超过 $ ...

最新文章

  1. loadrunner 录制 odbc 迭代出现lrd_db_option: ERROR, return-code=LRDE2009错误
  2. Python如何实现单例模式?其他23中设计模式python如何实现?
  3. spoj Help the Military Recruitment Office!
  4. 拉杰尔安卓服务器注册上限,拉结尔多开养小号刷副本 用多多云手机离线能升级...
  5. Apache httpclient的execute方法调试
  6. 去除inline-block元素间间距
  7. CompletionService VS ExecutorService
  8. android从一点展开动画,Android自定义View——从零开始实现可展开收起的水平菜单栏...
  9. 2019-11-07 检查gcc交叉编译器预定义宏(ARM32/ARM64/X86-64)以及对浮点数的支持情况
  10. 关于digit统计算法(C语言实现)
  11. silverlight:贝塞尔曲线
  12. Python--繁体中文与简体中文相互转换
  13. 前端常用PS技巧总结之将图片背景透明化
  14. MFC之画圆弧 任意三点绘制圆弧求弧长
  15. msxml3.dll 错误 '80072efd' ---asp 网站报错
  16. JavaWeb学习笔记(七)—— JSP
  17. atq1_使用at,atq,atrm和batchLinux调度命令示例
  18. Oracle日期类型转long类型
  19. 《Intriguing properties of neural networks》代码实现——Pytorch
  20. mac电脑有很多._开头的文件

热门文章

  1. html中电脑自动输入,电脑一直自动打字怎么办
  2. 高通msm8953平台摄像头移植
  3. Premiere常用快捷键
  4. EXCEL 在空值中批量填入某个数值
  5. Win7各正式版下载地址和SHA验证
  6. Android Studio实现简单的QQ登录界面
  7. 2020switch电信最快的dns_《2020switch电信最快的dns》电影_2020switch电信最快的dns正片免费观看-扬州人才服务网...
  8. Word怎么压缩变小?压缩word文档不妨试试这个方法
  9. MT666数字程序测试
  10. 清空分区linux,Linux使用fdisk删除分区详解