solution

用了一个很有意思的转移方法。

$dp[i][j] $ 表达 \(i\) 作为根,\(j\)个终端时最大的收益,即钱数,当\(0\leq dp[1][i]\)时,即以1为根可以转移到\(i\)个终端,且不亏本,此时\(i\)也最大时,i就是答案。

然后就是树上背包的套路题了。。

\[dp[u][j] = max(dp[u][j], dp[u][j - k]+dp[v][k]-len(u, v))
\]

自己思考一下。

code

#include <bits/stdc++.h>
using namespace std;
const int maxn = 3000 + 5;
int n, m, a[maxn], dp[maxn][maxn]; // id & zhongduan_num;
struct node {int to, z;};
vector <node> e[maxn];
int dfs(int x) {
if(x > n - m) {
dp[x][1] = a[x];
return 1;
}
int sum = 0;
for(int i = 0;i < e[x].size();i ++) {
int y = e[x][i].to, z = e[x][i].z, son = dfs(y);
sum += son;
for(int v = sum; v >= 0; v --) {
for(int j = 1;j <= min(son, v);j ++) {
dp[x][v] = max(dp[x][v], dp[x][v - j] + dp[y][j] - z);
}
}
}
return sum;
}
int main() {
memset(dp, 0xcf, sizeof(dp));
cin >> n >> m;
for(int i = 1;i <= n;i ++)
dp[i][0] = 0;
for(int i = 1, A, C;i <= n - m;i ++) {
int k; cin >> k;
for(int j = 1;j <= k;j ++) {
cin >> A >> C;
e[i].push_back((node){A, C});
}
}
for(int i = 1;i <= m;i ++) {
cin >> a[n - m + i];
}
dfs(1);
for(int i = m;i >= 1;i --) {
if(dp[1][i] >= 0) {
cout << i;
return 0;
}
}
puts("0");
return 0;
}

thanks

最新文章

  1. Oracle学习笔记十 使用PL/SQL
  2. IE浏览器版本判断 HTML代码
  3. Java集合系列:-----------04fail-fast总结(通过ArrayList来说明fail-fast的原理以及解决办法)
  4. POJ 3617 Best Cow Line (贪心)
  5. 后台向前台传递entity的list然后构筑combobox的方法(easyui)
  6. [实变函数]5.3 非负可测函数的 Lebesgue 积分
  7. 为EditText设置OnTouchListener事件监听
  8. Keil 的辅助工具和部份高级技巧
  9. MySQL用户管理语句001
  10. 学点c++
  11. react-router3.x hashHistory render两次的bug,及解决方案
  12. 基于TFS的.net技术路线的云平台DevOps实践
  13. Hive学习笔记 --Permission denied: user=anonymous, access=READ
  14. 2018-2019-2 网络对抗技术 20165239 Exp2 后门原理与实践
  15. SOJ 1685:chopsticks(dp)
  16. Docker部署tomcat及应用
  17. Python3下载图片的方法
  18. 洗礼灵魂,修炼python(56)--爬虫篇—知识补充—编码之url编码
  19. html-display标签
  20. [iOS] Win8下在Vmware11中安装使用苹果系统OS X 10.10

热门文章

  1. js中!!的运用
  2. App 后台架构
  3. Redis---03Redis事务
  4. java线程池拒绝策略使用实践
  5. QQ 邮箱日历提醒
  6. .netcore实现jwt身份验证
  7. SQL service 数据插入
  8. 《Web接口开发与自动化测试》学习笔记(三)
  9. 【Kata Daily 190910】Who likes it?(谁点了赞?)
  10. 剑指offer之打印超过数组一半的数字