圣诞树
2015-10-15 09:14
302 查看
[问题描述]
圣诞特别礼物挂在一棵圣诞树上,这棵树有n层,每层有一件礼物,每件礼物都有一个价值,有的礼物还有一些连结线,与下层的礼物相连,领取礼物的规则如下:任选一件礼物,它的下面如果有连结线,则可以继续取它连结的礼物,以此类推,直至取到没有连结线的礼物才结束,你如果是第一个去取,怎样取才能获得最大的价值呢?请你编一程序解决这一问题。 [输入文件] 输入文件tree.in的第一行只有一个数据n(n<=100),表示有n层礼物,以下有n行数据,分别表示第1-n层礼物的状态,每行至少由一个数据构成,且第一个数据表示该礼物的价值,后面的数据表示它与哪些层的礼物相连,如果每行只有一个数据则说明这层礼物没有与下层礼物相连,每个数的大小均不超过10000。 [输出文件] 输出文件tree.out也只有一个数,表示获得的取大价值。 [输入样例] 3 12 2 3 20 30 [输出样例]
解题思路
这个叫做DP。。。用f【i】表示从当前层开始能取得的最大价值那么DP方程:f【i】:=a【i】+max(f【j】)
j++(j< i)
看着好像就是简单的递推啊
代码
var t,n,i,j:integer; max:longint; a,f,sum:array[1..100]of longint; g:array[1..100,1..100]of 0..1; begin readln(n); for i:=1 to n do for j:=1 to n do g[i,j]:=0; for i:=1 to n do begin read(a[i]); while not eoln do begin read(t); g[i,t]:=1; end; end; f :=a ; for i:=n-1 downto 1 do begin max:=0; for j:=i+1 to n do if (g[i,j]=1) and (max<f[j]) then max:=f[j]; f[i]:=max+a[i]; end; max:=0; for i:=1 to n do if max<f[i] then max:=f[i]; write(max); end. 测试点1 Accepted / 0ms / 268kB 测试点2 Accepted / 0ms / 268kB 测试点3 Accepted / 0ms / 268kB 测试点4 Accepted / 0ms / 268kB 测试点5 Accepted / 0ms / 268kB 测试点6 Accepted / 0ms / 268kB 测试点7 Accepted / 0ms / 268kB 测试点8 Accepted / 0ms / 268kB 测试点9 Accepted / 0ms / 268kB 测试点10 Accepted / 1ms / 268kB
相关文章推荐
- 基于Android中dp和px之间进行转换的实现代码
- Android中dip、dp、sp、pt和px的区别详解
- LFC1.0.0 版本发布
- Android px、dp、sp之间相互转换
- android中像素单位dp、px、pt、sp的比较
- Android对px和dip进行尺寸转换的方法
- Android根据分辨率进行单位转换-(dp,sp转像素px)
- android 尺寸 dp,sp,px,dip,pt详解
- DP问题各种模型的状态转移方程
- POJ-1695-Magazine Delivery-dp
- nyoj-1216-整理图书-dp
- TYVJ1193 括号序列解题报告
- 对DP的一点感想
- TYVJ上一些DP的解题报告
- soj1005. Roll Playing Games
- 01背包问题
- LeetCode之Maximum Product Subarray
- DP Flow
- zoj3605 Find the Marble(三维dp)
- Word Break I,II, Triangle,Palindrome Partitioning 动态规划 DP