传送门: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相关推荐

  1. begin.lydsy 入门OJ题库:1104:纯粹合数

    1104: 纯粹素数 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 258  Solved: 91 [Submit][Status][Web Boar ...

  2. hihoCoder 网络流四·最小路径覆盖

    题面带解释 hihoCoder感觉很好. 网络流的精华就是建图 #include<cstdio> #include<iostream> #include<algorith ...

  3. hihoCoder #1142 : 三分求极值

    #1142 : 三分·三分求极值 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 这一次我们就简单一点了,题目在此: 在直角坐标系中有一条抛物线y=ax^2+bx+c和一 ...

  4. hihocoder 后缀自动机专题

    一.后缀自动机基本概念的理解 1.首先后缀自动机的状态是由子串的endpos来决定的 子串的endpos是指一个子串可以在原字符串的哪些位置进行匹配, endpos构成的不同集合划分成不同的状态 关于 ...

  5. hihoCoder 1051 补提交卡(贪心,枚举)

    #1051 : 补提交卡 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho给自己定了一个宏伟的目标:连续100天每天坚持在hihoCoder上提交一个程序.100天过 ...

  6. hihoCoder week3 KMP算法

    题目链接 https://hihocoder.com/contest/hiho3/problems kmp算法 #include <bits/stdc++.h> using namespa ...

  7. hihoCoder 第136周 优化延迟(二分答案+手写堆)

    题目1 : 优化延迟 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho编写了一个处理数据包的程序.程序的输入是一个包含N个数据包的序列.每个数据包根据其重要程度不同 ...

  8. hihoCoder 1578 Visiting Peking University 【贪心】 (ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛)...

    #1578 : Visiting Peking University 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 Ming is going to travel for ...

  9. hihoCoder太阁最新面经算法竞赛18

    比赛链接:http://hihocoder.com/contest/hihointerview27/problems A.Big Plus 模拟水 1 #include <bits/stdc++ ...

最新文章

  1. UVA1660 电视网络 Cable TV Network(网络流,最小割)
  2. Endnote X8云同步:家里单位实时同步文献笔记,有网随时读文献
  3. python int函数详解_Python内置函数OCT详解
  4. QT集成QML和JavaScript
  5. gradle入门_Gradle入门:集成测试
  6. 服务去获取配置中心配置
  7. python二维数组操作_Python二维数组应用与操作
  8. 可视化工具Navicat for MySQL-操作三
  9. python 生成图片_python生成带有表格的图片
  10. OpenCV4.0-alpha发布!新增多个深度学习特性
  11. 多线程bug处理记录
  12. 功能测试常用6种方法_云端功能测试:更好的12种方法
  13. POJ 2773 Happy 2006 (容斥原理)
  14. 卷积神经网络CNN原理以及TensorFlow实现
  15. 海量Oracle学习视频分享
  16. SpringCloud之熔断器Hystrix(二)
  17. 毕业设计大全——毕业设计参考选题(Jsp+Servlet+SSM+SpringBoot)(持续更新)
  18. Zabbix 监控之项目类型-Trapper
  19. 学习毅力篇:学习拖拖拉拉?3招治愈拖延症!
  20. 异地IT驻场外包人员如何管理?

热门文章

  1. 精准高效估计多人3D姿态,美图北航分布感知式单阶段模型(CVPR 2022)
  2. 万万没想到,AI算法开发、OCR应用已经进入零门槛时代!
  3. 人才认证+奖金,智能分拣挑战赛baseline助力最后冲刺
  4. 如何学习机器学习、看待算法竞赛?粉丝精选留言
  5. 强调模型可复现性!英伟达与伦敦国王学院开源医学AI框架 MONAI
  6. 三分钟理解Python函数式编程与闭包
  7. 墨子科技成果是计算机,祖国强起来!为2017年这些重大科技成果打call
  8. 还在修改博士论文?这份《博士论文写作技巧》为你指南
  9. 带你自学Python系列(八):列表具体操作思维导图总结,再也不用翻书查用法了!...
  10. 数学建模、统计学之方差分析