Starship Troopers

简介: HDU的一道常规动态规划题目。 题目重述: 每个队员都能够对付20只虫子,但是如果有21只虫子,你也得出2个人来对付。输入数据中,先是N(N

HDU的一道常规动态规划题目。

题目重述:

每个队员都能够对付20只虫子,但是如果有21只虫子,你也得出2个人来对付。输入数据中,先是N(N <= 100)个洞穴,然后再是M(M <= 100)个队员。然后输入N个洞穴的信息,包括有多少只虫子,其中存在Boss的概率是多少。然后再是洞穴的联通情况,双向连通。在处理保存虫子的数组时实际上是耗费队员的数组 bug[i] = (bug[i] + 19)/20; 。

转移方程:

通过DFS进行遍历,转移方程为 dp[当前洞穴][耗费人数] = max{dp[当前洞穴][耗费人数],dp[当前洞穴][当前洞穴派走了k个人] + dp[子洞穴][派往子洞穴k个人]},这是一道树形DP题。

 

源代码:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<vector>
 5 #define MAXN 105
 6 using namespace std;
 7 int dp[MAXN][MAXN];
 8 int m,n;
 9 int bug[MAXN];
10 int possible[MAXN];
11 vector<int>cavern[MAXN];
12 
13 void DFS(int root, int pos)
14 {
15     for(int i = bug[root]; i <= m; i++)
16         dp[root][i] = possible[root];
17     int tot = (int)cavern[root].size();
18     for(int i = 0; i < tot; i++)
19     {
20         int v = cavern[root][i];
21         if(v == pos)
22             continue;
23         DFS(v, root);
24         for(int j = m; j >= bug[root]; j--)
25             for(int k = 1; k <= j-bug[root]; k++)
26             {
27                 dp[root][j] = max(dp[root][j], dp[root][j-k] + dp[v][k]);
28             }
29     }
30 }
31 
32 int main()
33 {
34     while(~scanf("%d%d", &n, &m) && n != -1 || m != -1)
35     {
36         for(int i = 0; i < n; i++)
37         {
38             scanf("%d%d", &bug[i], &possible[i]);
39             bug[i] = (bug[i] + 19)/20;
40         }
41         for(int i = 0; i < n; i++)
42             cavern[i].clear();
43         for(int i = 0, a, b; i < n-1; i++)
44         {
45             scanf("%d%d", &a, &b);
46             cavern[a-1].push_back(b-1);
47             cavern[b-1].push_back(a-1);
48         }
49         if(m == 0)
50         {
51             printf("0\n");
52             continue;
53         }
54         memset(dp, 0, sizeof(dp));
55         DFS(0, -1);
56         printf("%d\n", dp[0][m]);
57     }
58     return  0;
59 }

 

相关文章
|
6月前
|
前端开发
掌握React中的useCallback:优化性能的秘诀
掌握React中的useCallback:优化性能的秘诀
poi.openxml4j.exceptions.InvalidFormatException: Package should contain a content type part [M1.13]
poi.openxml4j.exceptions.InvalidFormatException: Package should contain a content type part [M1.13]
322 0
|
6月前
|
缓存 PHP 开发工具
PHP 开发者该知道的 5 个 Composer 小技巧
PHP 开发者该知道的 5 个 Composer 小技巧
|
存储 调度 虚拟化
2.3.1 虚拟资源层 虚拟化软件|学习笔记
快速学习2.3.1 虚拟资源层 虚拟化软件
2.3.1 虚拟资源层 虚拟化软件|学习笔记
|
12月前
|
存储 机器学习/深度学习 缓存
【C++】deque的实现原理简单介绍
【C++】deque的实现原理简单介绍
|
XML 设计模式 Java
Spring高手之路1——深入理解与实现IOC依赖查找与依赖注入
本文通过详细的代码示例,详细解析了Spring框架中IOC的两种核心实现方式:依赖查找和依赖注入。我们通过创建基本的IOC依赖查找实例,详解了如何在实践中运用这两种手段,并在三层架构中体验其使用方式。同时,我们也深度对比了依赖查找与依赖注入的优缺点和应用场景,为读者在面试中解答相关问题提供了参考。
618 1
Spring高手之路1——深入理解与实现IOC依赖查找与依赖注入
|
机器学习/深度学习 编解码 数据可视化
NeRF系列(1):NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis 论文解读与公式推导(二)
NeRF系列(1):NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis 论文解读与公式推导(二)
213 0
|
JavaScript API
百度Web服务API跨域的Cross-Origin Read Blocking (CORB) blocked cross-origin response报错两种解决方案
百度Web服务API跨域的Cross-Origin Read Blocking (CORB) blocked cross-origin response报错两种解决方案
428 0
|
6月前
|
弹性计算 API
大咖与小白的日常:ECS如何对比性能?试试这个API
本文为您介绍阿里云云服务器ECS的选型过程中,可用于对比实例性能的DescribeInstanceTypes API。
|
存储 Oracle 关系型数据库
使用shell在Linux系统下下载cmip6文件出现报错:No ESG Credentials found in /Users/daniele/.esg/credentials.pem
如何解决Linux系统下下载cmip6模式数据出现的报错:No ESG Credentials found in ***/credentials.pem
使用shell在Linux系统下下载cmip6文件出现报错:No ESG Credentials found in /Users/daniele/.esg/credentials.pem