Laoj P1650 The more, The Better


试题描述

ACboy很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城堡并获得里面的宝物。但由于地理位置原因,有些城堡不能直接攻克,要攻克这些城堡必须先攻克其他某一个特定的城堡。你能帮ACboy算出要获得尽量多的宝物应该攻克哪M个城堡吗? 

输入格式

每个测试实例首先包括2个整数,N,M.(1 <= M <= N <= 200);在接下来的N行里,每行包括2个整数,a,b. 在第 i 行,a 代表要攻克第 i 个城堡必须先攻克第 a 个城堡,如果 a = 0 则代表可以直接攻克第 i 个城堡。b 代表第 i 个城堡的宝物数量, b >= 0。当N = 0, M = 0输入结束。

输出格式

对于每个测试实例,输出一个整数,代表ACboy攻克M个城堡所获得的最多宝物的数量。

输入示例

3 2
0 1
0 2
0 3
7 4
2 2
0 1
0 4
2 1
7 1
7 6
2 2
0 0


输出示例

5
13

【分析】

树形dp,这种要求在n个里取m个的我不会用前向星写,所以只好用邻接矩阵了...

【代码】

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 int n,m;
 5 int c[320] ,b[320] ,s[320], dp[320][320];
 6
 7 int maxx(int a, int b, int c) {
 8     int ans=a;
 9     if (b>ans)
10         ans=b;
11     if (c>ans)
12         ans=c;
13     return ans;
14 }
15
16 void maketree() {
17     memset(c, 0, sizeof(c));
18     memset(b, 0, sizeof(b));
19     memset(s, 0, sizeof(s));
20     memset(dp, -1, sizeof(dp));
21     cin >> n >> m;
22     if (n==0 && m==0)
23         exit(0);
24     for(int i=1;i<=n;i++){
25         int ta,tb;
26         scanf("%d%d",&ta,&tb);
27         s[i]=tb;
28         if(ta==0) ta=n+1;
29         b[i]=c[ta];
30         c[ta]=i;
31     }
32 }
33
34 void dfs(int x,int y) {
35     if(dp[x][y]>=0)    return;
36     if(x==0 || y==0) {  dp[x][y]=0;return;}
37     dfs(b[x],y);
38     for(int k=0;k<y;k++){
39         dfs(b[x],k);
40         dfs(c[x],y-k-1);
41         dp[x][y]=maxx(dp[x][y],  dp[b[x]][y], dp[b[x]][k]+dp[c[x]][y-k-1]+s[x]);
42     }
43     return;
44 }
45
46 int main() {
47     while (true) {
48         maketree();
49         dfs(c[n+1],m);
50         cout << dp[c[n+1]][m] << endl;
51     }
52     return 0;
53 }
时间: 2024-09-29 15:32:21

Laoj P1650 The more, The Better的相关文章

Laoj P1283 过河问题

试题描述 在一个大晴天,Oliver与同学们一共N人出游,他们走到一条河的东岸边,想要过河到西岸.而东岸边有一条小船.船太小了,一次只能乘坐两人,每个人都有一个渡河时间T,船划到对岸的时间等于船上渡河时间较长的人所用的时间.现在已知N个人的渡河时间T,Oliver想要你告诉他,他们最少要花费多少时间,才能使所有人都过河.注意,只有船在东岸(西岸)时东岸(西岸)的人才能坐上船划到对岸. 输入格式 输入文件第一行为人数N,以下有N行,每行一个数. 第i+1行的数为第i个人的渡河时间. 输出格式  输

洛谷P1650赛马与codevs 2181 田忌赛马

洛谷P1650 赛马 题目描述 我国历史上有个著名的故事: 那是在2300年以前.齐国的大将军田忌喜欢赛马.他经常和齐王赛马.他和齐王都有三匹马:常规马,上级马,超级马.一共赛三局,每局的胜者可以从负者这里取得200银币.每匹马只能用一次.齐王的马好,同等级的马,齐王的总是比田忌的要好一点.于是每次和齐王赛马,田忌总会输600银币. 田忌很沮丧,直到他遇到了著名的军师――孙膑.田忌采用了孙膑的计策之后,三场比赛下来,轻松而优雅地赢了齐王200银币.这实在是个很简单的计策.由于齐王总是先出最好的马

Laoj P1170 [noip2004]合并果子(STL解法)

试题描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆.每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了.多多在合并果子时总共消耗的体力等于每次合并所消耗体力之和.因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力.假定每个果子重量都为1,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使多多耗费的体力最少

Laoj P1356 伊甸园日历游戏

试题描述   Adam和Eve玩一个游戏,他们先从1900.1.1到2001.11.4这个日期之间随意抽取一个日期出来.然后他们轮流对这个日期进行操作: 1 : 把日期的天数加1,例如1900.1.1变到1900.1.2 2 : 把月份加1,例如:1900.1.1变到1900.2.1 其中如果天数超过应有天数则日期变更到下个月的第1天.月份超过12则变到下一年的1月.而且进行操作二的时候,如果有这样的日期:1900.1.31,则变成了1900.2.31,这样的操作是非法的,我们不允许这样做.而且

Laoj P1272 取数

问题背景 动态规划入门-第21题 试题描述 从1,2,...,n中任取k个数,要求所取的k个数中,任意两个数不能相差1.编程求有多少种取法.如:n=6 ,k=3,,从1,2,3,4,5,6中取3个数,任意两个数不能相差1,取法如下:(1  3  5) (1  3   6) (1  4  6) (2  4  6)共有4种取法.提示:(1  3  5)和(3  1  5)属于一种取法. 输入格式 一行,n和k,中间用空格隔开(1<=k<=n<=100) 输出格式 一行,取法的种数. 输入示例

Laoj P1285 回文词(ioi2000)

试题描述 所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba".当然,我们给你的问题不会再简单到判断一个字符串是不是回文字符串.现在要求你,给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串. 输入格式 一个字符串,长度不超过1000. 输出格式 每行输出所需添加的最少字符数 输入示例 Ab3bd 输出示例 2 [分析] s2是与s1相反的字符串,只要求出s1与s2的lcs,再拿总长度减去这个值即是答案. 我之前推出来

Laoj P1288 最小乘车费用

问题背景 简单线性DP 试题描述 假设某条街上每一公里就有一个公共汽车站,并且一种可能的乘车费用如下表:公里数 1 2 3 4 5 6 7 8 9 10费用 12 21 31 40 49 58 69 79 90 101而任意一辆汽车从不行驶超过10公里.某人想乘车到达n公里远的地方,假设他可以任意次换车,请你帮他找到一种乘车方案,使得总费用最小.注意:10公里的费用比1公里小的情况是允许的. 输入格式 共两行.第一行为10个不超过200的整数,依次表示行驶1~10公里的费用,相邻两数间用一个空格

Laoj P1194 [hnoi97]最长不下降序列

问题背景 动态规划入门-第13题 试题描述 设有整数序列b1,b2,b3,-,bm,若存在i1<i2<i3<-<in,且bi1<bi2<bi3<-<bin,则称 b1,b2,b3,-,bm中有长度为n的不下降序列bi1,bi2,bi3,-,bin.求序列b1,b2,b3,-,bm中所有长度(n)最大不下降子序列.例如3,18,7,14,10,12,23,41,16,24,其中3,18,23,24就是一个长度为4的不下降序列,同时也有3,7,10,12,16,

Laoj P1196 最长公共子序列

问题背景 动态规划入门-第15题    试题描述 一个给定序列的子序列是在该序列中删去若干元素后得到的序列.确切地说,若给定序列X=<x1,x2,--,xm>,则另一序列Z=<z1,z2,--,zk>是X的子序列是指存在一个严格递增的下标序列 <i1,i2,--,ik>,使得对于所有j=1,2,--,k有: Zj=Xij例如,序列Z=<B,C,D,B>是序列X=<A,B,C,B,D,A,B>的子序列,相应的递增下标序列为<2,3,5,7&g