hihoCoder #1104 Suzhou Adventure
传送门:http://hihocoder.com/problemset/problem/1104
解题思路:
这是一道树上的动态规划问题 首先将多叉树转化为二叉树存储,再根据题中推荐访问的村庄地点预先处理得到必须访问的村庄集合,以便在动态规划时使用辅助决策,根据状态转移方程求解。
1 #include <iostream> 2 #include <vector> 3 #include <cstring> 4 #include <set> 5 6 int score[101]; 7 int N, K, M; 8 int dp[101][101]; 9 std::vector<int> edges[101]; 10 int b[101] = {0}; 11 int c[101] = {0}; 12 std::set<int> must; 13 14 void makeTree() 15 { 16 int a,b; 17 for (int i = 0; i < N-1; ++i) { 18 std::cin >> a >> b; 19 edges[a].push_back(b); 20 edges[b].push_back(a); 21 } 22 } 23 24 void convertToBT(int node, int par) 25 { 26 for (int i = 0; i < edges[node].size(); ++i) { 27 if (edges[node][i] != par) { 28 b[edges[node][i]] = c[node]; 29 c[node] = edges[node][i]; 30 convertToBT(edges[node][i], node); 31 } 32 } 33 } 34 35 void preProcess(int node, int par) 36 { 37 if (edges[node].size() == 1 && edges[node][0] == par) return; 38 39 for (int i = 0; i < edges[node].size(); ++i) { 40 if (edges[node][i] != par) { 41 preProcess(edges[node][i], node); 42 if (must.count(edges[node][i])) { 43 must.insert(node); 44 } 45 } 46 } 47 } 48 49 int dfs(int n, int m) 50 { 51 if (dp[n][m] != -1) return dp[n][m]; 52 if (m == 0 ) { 53 if (n == 0 || ( must.count(n) == 0 && dfs(c[n],0)==0 && dfs(b[n], 0) == 0)) return dp[n][m] = 0; 54 else return dp[n][m] = -2; 55 } 56 if (n == 0 && m != 0) {return dp[n][m] = -2;} 57 58 59 int maxm = -2; 60 if (must.count(n) == 0) { 61 maxm = dfs(b[n], m); 62 } 63 64 for (int i = 0; i < m; ++i) { 65 if (dfs(c[n], i) == -2 || dfs(b[n], m-1-i) == -2) continue; 66 else { 67 maxm = std::max(maxm, dp[c[n]][i] + dp[b[n]][m-1-i] + score[n]); 68 } 69 } 70 71 return dp[n][m] = maxm; 72 73 } 74 75 int main() 76 { 77 std::cin >> N >> K >> M; 78 for (int i = 1; i <= N; ++i) { 79 std::cin >> score[i]; 80 } 81 int v; 82 for (int i = 0; i < K; ++i) { 83 std::cin >> v; 84 must.insert(v); 85 } 86 if (K > M) {std::cout << -1 << std::endl; return 0;} 87 memset(dp, -1, sizeof dp); 88 makeTree(); 89 convertToBT(1,-1); 90 preProcess(1, -1); 91 int maxm = dfs(1, M); 92 if (maxm < 0) std::cout << -1 << std::endl; 93 else std::cout << maxm << std::endl; 94 }
转载于:https://www.cnblogs.com/liew/p/4315563.html
hihoCoder #1104 Suzhou Adventure相关推荐
- begin.lydsy 入门OJ题库:1104:纯粹合数
1104: 纯粹素数 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 258 Solved: 91 [Submit][Status][Web Boar ...
- hihoCoder 网络流四·最小路径覆盖
题面带解释 hihoCoder感觉很好. 网络流的精华就是建图 #include<cstdio> #include<iostream> #include<algorith ...
- hihoCoder #1142 : 三分求极值
#1142 : 三分·三分求极值 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 这一次我们就简单一点了,题目在此: 在直角坐标系中有一条抛物线y=ax^2+bx+c和一 ...
- hihocoder 后缀自动机专题
一.后缀自动机基本概念的理解 1.首先后缀自动机的状态是由子串的endpos来决定的 子串的endpos是指一个子串可以在原字符串的哪些位置进行匹配, endpos构成的不同集合划分成不同的状态 关于 ...
- hihoCoder 1051 补提交卡(贪心,枚举)
#1051 : 补提交卡 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho给自己定了一个宏伟的目标:连续100天每天坚持在hihoCoder上提交一个程序.100天过 ...
- hihoCoder week3 KMP算法
题目链接 https://hihocoder.com/contest/hiho3/problems kmp算法 #include <bits/stdc++.h> using namespa ...
- hihoCoder 第136周 优化延迟(二分答案+手写堆)
题目1 : 优化延迟 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho编写了一个处理数据包的程序.程序的输入是一个包含N个数据包的序列.每个数据包根据其重要程度不同 ...
- hihoCoder 1578 Visiting Peking University 【贪心】 (ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛)...
#1578 : Visiting Peking University 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 Ming is going to travel for ...
- hihoCoder太阁最新面经算法竞赛18
比赛链接:http://hihocoder.com/contest/hihointerview27/problems A.Big Plus 模拟水 1 #include <bits/stdc++ ...
最新文章
- UVA1660 电视网络 Cable TV Network(网络流,最小割)
- Endnote X8云同步:家里单位实时同步文献笔记,有网随时读文献
- python int函数详解_Python内置函数OCT详解
- QT集成QML和JavaScript
- gradle入门_Gradle入门:集成测试
- 服务去获取配置中心配置
- python二维数组操作_Python二维数组应用与操作
- 可视化工具Navicat for MySQL-操作三
- python 生成图片_python生成带有表格的图片
- OpenCV4.0-alpha发布!新增多个深度学习特性
- 多线程bug处理记录
- 功能测试常用6种方法_云端功能测试:更好的12种方法
- POJ 2773 Happy 2006 (容斥原理)
- 卷积神经网络CNN原理以及TensorFlow实现
- 海量Oracle学习视频分享
- SpringCloud之熔断器Hystrix(二)
- 毕业设计大全——毕业设计参考选题(Jsp+Servlet+SSM+SpringBoot)(持续更新)
- Zabbix 监控之项目类型-Trapper
- 学习毅力篇:学习拖拖拉拉?3招治愈拖延症!
- 异地IT驻场外包人员如何管理?
热门文章
- 精准高效估计多人3D姿态,美图北航分布感知式单阶段模型(CVPR 2022)
- 万万没想到,AI算法开发、OCR应用已经进入零门槛时代!
- 人才认证+奖金,智能分拣挑战赛baseline助力最后冲刺
- 如何学习机器学习、看待算法竞赛?粉丝精选留言
- 强调模型可复现性!英伟达与伦敦国王学院开源医学AI框架 MONAI
- 三分钟理解Python函数式编程与闭包
- 墨子科技成果是计算机,祖国强起来!为2017年这些重大科技成果打call
- 还在修改博士论文?这份《博士论文写作技巧》为你指南
- 带你自学Python系列(八):列表具体操作思维导图总结,再也不用翻书查用法了!...
- 数学建模、统计学之方差分析