博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 3345(树形dp)
阅读量:5956 次
发布时间:2019-06-19

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

题意:一个人要买通若干支持者,这些支持者的关系形成一棵森林,只要买通树根他的孩子节点也会被买通,问你至少要买通m个守卫要花多少钱。

思路:由于是一颗森林我们需要加一个结点使得他到每个点都建一条边,然后dp[i][j]表示i为根的结点买通j个需要的最小花费。

dp[v][j] = min(dp[v][j], dp[v][j-k] + dp[x][k]);

代码如下:

1 #include 
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 #include
10 #include
11 #define MP(a, b) make_pair(a, b)12 #define PB(a) push_back(a)13 using namespace std;14 15 const int LEN = 210;16 const int INF = 0x3f3f3f3f;17 int n, m, vex[LEN], dp[LEN][LEN], ind[LEN], top;18 vector
Map[LEN];19 map
mp;20 21 int ch(string s){22 if(!mp.count(s))mp[s] = top++;23 return mp[s];24 }25 26 int dfs(int v, int fa){27 int ret = 1;28 dp[v][0] = 0;29 for(int i=0; i
=0; j--){34 for(int k=0; k<=j; k++){35 dp[v][j] = min(dp[v][j], dp[v][j-k] + dp[x][k]); 36 }37 }38 }39 }40 dp[v][ret] = min(dp[v][ret], vex[v]);41 return ret;42 }43 44 int main()45 {46 freopen("in.txt", "r", stdin);47 48 char buf[LEN], na[LEN], nb[LEN];49 int tn, a, b;50 while(scanf("%s", buf)!=EOF){51 if(buf[0] == '#') break;52 for(int i=0; i
View Code

 

转载于:https://www.cnblogs.com/shu-xiaohao/p/3709497.html

你可能感兴趣的文章
c++读取和写入TXT文件的整理
查看>>
深入动态人脸识别小场景应用,2019年或将迎来爆发期
查看>>
Ionic2 下处理 Android 设备下返回按钮的事件
查看>>
linux安全问答(1)
查看>>
zabbix监控进程的CPU和内存占用量
查看>>
【自用】手工编译lnmp环境
查看>>
普通用户通过Putty密钥方式登录
查看>>
网页显示3D模型
查看>>
第六章:thymeleaf页面模版-1. 信息输出
查看>>
Ubuntu 16.04 install Docker 1.12.0
查看>>
2012《Linux杂志》读者选择奖 (Readers' Choice Awards 2012- Linux Journal)
查看>>
21天让你成为Horizon View高手—Day11:手动池的创建
查看>>
Python迭代对象、迭代器、生成器
查看>>
请求转发与重定向的区别
查看>>
大数据分析 | 百年奥运往事知多少
查看>>
矩形覆盖-----批了外皮的亲蛙跳
查看>>
@RequestParam今天才知道是咋用的..
查看>>
全国第一家FPGA云主机(FAAS)正式启动售卖,被阿里云抢先了。
查看>>
Linux 局域网路由新手指南:第 2 部分
查看>>
TensorSpace:超酷炫3D神经网络可视化框架
查看>>