https://scut.online/p/216

演员

把这个当成dp算了半天,各种姿势,好吧,就当练习一下树dp。

假如是每个节点的层数之和,按照dp[i][j]为从i点出发获得j科技的最小费用dp是比较好的。

改了改居然也可以过。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll; vector<pair<int, int> > E[50]; int d[50];
int f[50];
int n, W; int dp[50][500][3];
//dp[i][j][0]表示i点是叶子的获取总共j点科技需要的最低价格
//dp[i][j][1]表示从i点出发并且i不是叶子的获取总共j点科技需要的最低价格
//dp[i][j][2]表示dp[i][j][1]拷贝
//科技不会超过400 const int INF = 0x3f3f3f3f; void dfs(int r, int p, int dep, int w) {
memset(dp[r], INF, sizeof(dp[r]));
//只走到自己不需要任何价格
dp[r][dep][0] = 0;
//不获取任何科技点也不需要任何价格
dp[r][0][1]=0;
for(auto e : E[r]) {
int vi = e.first, wi = e.second;
dfs(vi, r, dep + 1, wi);
}
if(f[r]==-1)
return; int maxk=300;
for(int k=340;k>=0;--k){
if(dp[r][k][0]!=INF||dp[r][k][1]!=INF){
maxk=k;
//cout<<"maxk="<<maxk<<endl;
break;
}
}
for(int j = 0; j <= 340; ++j)
dp[f[r]][j][2]=dp[f[r]][j][1];
for(int k =maxk; k >= 0; --k) {
for(int j = k; j <= 340; ++j){
dp[f[r]][j][2]=min(dp[f[r]][j][2],dp[f[r]][j-k][1]+dp[r][k][0]+w);
dp[f[r]][j][2]=min(dp[f[r]][j][2],dp[f[r]][j-k][1]+dp[r][k][1]+w);
}
} for(int j = 0; j <= 340; ++j)
dp[f[r]][j][1]=dp[f[r]][j][2];
/*for(int v = 0; v <= 12; ++v) {
printf("dp[%c][%d][0]=%d\n", r + 'A', v, dp[r][v][0]);
printf("dp[%c][%d][1]=%d\n", r + 'A', v, dp[r][v][1]);
printf("dp[%c][%d][0]=%d\n", f[r] + 'A', v, dp[f[r]][v][0]);
printf("dp[%c][%d][1]=%d\n\n", f[r] + 'A', v, dp[f[r]][v][1]);
}*/
return;
} bool vis[50]; int main() {
#ifdef Yinku
freopen("Yinku.in", "r", stdin);
#endif // Yinku
while(~scanf("%d%d", &n, &W)) {
for(int i = 0; i < 26; ++i) {
E[i].clear();
d[i] = 0;
vis[i] = 0;
}
if(n == 1) {
puts("0");
continue;
}
for(int i = 1; i <= n - 1; ++i) {
char s[20], t[20];
int w;
scanf("%s%s%d", s, t, &w);
E[s[0] - 'A'].push_back({t[0] - 'A', w});
d[t[0] - 'A']++;
f[t[0] - 'A'] = s[0] - 'A';
vis[s[0] - 'A'] = vis[t[0] - 'A'] = true;
}
int r = -1;
for(int i = 0; i < 26; ++i) {
if(vis[i] && d[i] == 0)
r = i;
}
f[r]=-1;
dfs(r, -1, 0, 0);
int ans = 0;
for(int i = 340; i >= 0; --i) {
if(dp[r][i][1] <= W || dp[r][i][0] <= W) {
ans = max(ans, i);
}
}
printf("%d\n", ans);
}
return 0;
} /* 8 11
A B 8
B C 3
C D 1
D E 1
E F 1
A R 2
R W 9 */

SCUT - 216 - 宝华科技树的更多相关文章

  1. SCUT - 240 - 宝华的文件系统 - 模拟

    https://scut.online/p/240 就是要小心绝对路径中也有.和..出现. #include<bits/stdc++.h> using namespace std; #de ...

  2. SCUT - 243 - 宝华复习 - 二分 - 桶计数

    https://scut.online/p/243 这道题唯一难点在于如何快速确定m合法.可以统计滑动窗口中已有元素的数量. #include<bits/stdc++.h> using n ...

  3. Atitti 图像处理 特征提取的科技树 attilax总结

    Atitti 图像处理 特征提取的科技树 attilax总结 理论 数学,信号处理,图像,计算机视觉 图像处理 滤波 图像处理 颜色转换 图像处理 压缩编码 图像处理 增强 图像处理 去模糊 图像处理 ...

  4. 宋宝华: 关于Linux进程优先级数字混乱的彻底澄清

    宋宝华: 关于Linux进程优先级数字混乱的彻底澄清 原创: 宋宝华 Linux阅码场 9月20日 https://mp.weixin.qq.com/s/44Gamu17Vkl77OGV2KkRmQ ...

  5. 宋宝华:Docker 最初的2小时(Docker从入门到入门)

    本文系转载,著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者: 宋宝华 来源: 微信公众号linux阅码场(id: linuxdev) 最初的2小时,你会爱上Docker, ...

  6. 宋宝华:关于Ftrace的一个完整案例

    本文系转载,著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 作者: 宋宝华 来源: 微信公众号linux阅码场(id: linuxdev) Ftrace简介 Ftrace是Lin ...

  7. 宋宝华:Linux设备驱动框架里的设计模式之——模板方法(Template Method)

    本文系转载,著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 作者: 宋宝华 来源: 微信公众号linux阅码场(id: linuxdev) 前言 <设计模式>这本经典 ...

  8. 宋宝华: Linux内核编程广泛使用的前向声明(Forward Declaration)

    本文系转载,著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 作者:宋宝华 来源: 微信公众号linux阅码场(id: linuxdev) 前向声明 编程定律 先强调一点:在一切可 ...

  9. 宋宝华:关于ARM Linux原子操作的实现

    本文系转载,著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 作者: 宋宝华 来源: 微信公众号linux阅码场(id: linuxdev) 竞态无所不在 首先我们要理解竞态(ra ...

随机推荐

  1. Missing radix parameter.报错解决方法

    当报“Missing radix parameter.”这个错的时候,是因为使用parseInt没有传第二个参数,以前简写的时候大家几乎都不传,甚至不知道还有第二个参数. 当时候Eslint预发检查时 ...

  2. 选择vim编辑器的7个理由

    当我刚刚开始用 vi 文本编辑器的时候,我讨厌它!我认为这是有史以来设计上最痛苦和反人类的编辑器.但我还是决定我必须学会它,因为如果你使用的是 Unix,vi 无处不在并且是唯一一个保证你可以使用的编 ...

  3. c# B/S下 如何优化文件上传速度和实现断点续传问题

    IE的自带下载功能中没有断点续传功能,要实现断点续传功能,需要用到HTTP协议中鲜为人知的几个响应头和请求头. 一. 两个必要响应头Accept-Ranges.ETag 客户端每次提交下载请求时,服务 ...

  4. 游标定位:Cursor类

    关于 Cursor Cursor 是每行的集合. 使用 moveToFirst() 定位第一行. 你必须知道每一列的名称. 你必须知道每一列的数据类型. Cursor 是一个随机的数据源. 所有的数据 ...

  5. SQL create file遇到操作系统错误5拒绝访问

    当在sql server 2014创建一个数据库时出现错误:尝试打开或创建物理文件 'G:\Test.mdf' 时,CREATE FILE 遇到操作系统错误 5(拒绝访问). 原因及解决方法如下: 这 ...

  6. sqli-labs(22)

    接下里我们进入第二二关 好像和第21关一样 cookie的base64加密注入 闭合变成了双引号而已 0X01 构造语句进行尝试 " union select 1,2,3# IiB1bmlv ...

  7. MIME 类型,ContentType

    MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的因特网标准. MIME 消息能包含文本.图像.音频.视频以及其他应用程序专用的数据. 官方 ...

  8. 破解Excel 工作表/薄密码

    新建excel 在右上角的ThisWorkbook右键插入模块复制下列CODE. Option Explicit Public Sub AllInternalPasswords()' Breaks w ...

  9. 阶段3 1.Mybatis_11.Mybatis的缓存_6 Mybatis中的一级缓存

    Mybatis中的一级缓存和二级缓存         一级缓存:             它指的是Mybatis中SqlSession对象的缓存.             当我们执行查询之后,查询的结 ...

  10. 阶段3 1.Mybatis_08.动态SQL_01.mybatis中的动态sql语句-if标签

    创建新的工程 复制到新建的项目里面 pom.xml依赖部分复制过来 dao中整理代码 只保留四个查询 映射文件也只保留四个查询方法 增加一个根据条件查询的方法. 由于用了别名,所以parpameter ...