打砖块
来源:互联网 发布:淘宝手绘照片是真的吗 编辑:程序博客网 时间:2024/05/02 22:51
题意:
在刚开始的时候,有n行*m列的砖块,小红有k发子弹。小红每次可以用一发子弹,打碎某一列当前处于这一列最下面的那块砖,并且得到相应的得分。
如图所示:
某些砖块在打碎以后,还可能将得到一发子弹的奖励。最后当所有的砖块都打碎了,或者小红没有子弹了,游戏结束。
思路:
一开始先把每一列求一个用j发子弹打出的最大值,然后一列一列的扫过去,
设f[i,j]为钱i列用了j发子弹的最大值,可以得出方程
f[i,j]:=max(f[i-1,k]+sum[i,j-k])sum为上面求出的i列用j发子弹的最大值
程序:
const maxn=250;var k,i,j,n,m,ii:longint; c:char; a,b,f,s:array [0..maxn,0..maxn] of longint; flag:array [0..maxn,0..maxn] of boolean; ans:int64;function max(x,y:int64):int64;begin if x>y then exit(x) else exit(y);end;begin readln(n,m,k); for i:=1 to n do begin for j:=1 to m do begin read(a[i,j],c,c); if c='Y' then flag[i,j]:=true; end; end; for i:=1 to m do for j:=1 to n do begin b[i,j]:=b[i,j-1]+a[n-j+1,i]; if (flag[n-j+1,i]) and (s[i,j-1]<k) then s[i,j]:=s[i,j-1] else s[i,j]:=s[i,j-1]+1; end; for i:=0 to maxn do for j:=0 to maxn do f[i,j]:=-1; for i:=1 to n do if s[1,i]<=k then f[1,s[1,i]]:=b[1,i]; f[1,0]:=0; for i:=1 to m-1 do for j:=0 to k do begin if f[i,j]=-1 then continue; f[i+1,j]:=max(f[i+1,j],f[i,j]); for ii:=1 to n do begin if s[i+1,ii]+j>k then break; f[i+1,s[i+1,ii]+j]:=max(f[i,j]+b[i+1,ii],f[i+1,s[i+1,ii]+j]); ans:=max(ans,f[i+1,s[i+1,ii]+j]); end; end; writeln(ans);end.
0 0
- 打砖块
- 打砖块
- 打砖块
- 打砖块游戏源码
- HNOI2004 打砖块
- Qt打砖块游戏
- android 打砖块游戏
- Linux C 打砖块
- 【HNOI2004】打砖块
- wiki 1257 打砖块
- unity3D__球打砖块
- 【codevs1257】打砖块 DP
- 【codevs1257】 打砖块
- 洛谷 P1174 打砖块
- 洛谷 P1174 打砖块
- 打砖块Demo
- 洛谷 P1174 打砖块
- 打砖块小游戏1.0
- C# 斐波那契数列
- 最小割树Gomory-Hu tree
- 剑指offer-面试题28-字符串的排列
- 谈浮躁
- 移动端Touch事件与H5-Canvas像素点检测实现刮刮乐
- 打砖块
- 数据库笔试题及答案
- arm-eabi-addr2line 使用解析crash位置
- PAT 1004 Counting Leaves
- Bootstrap modal 被遮挡
- 使用备忘录的方法计算组合,例如计算C(n,k).
- 内存映射文件(专门读写大文件)
- UVA253-4.4(ti)-Cube painting
- 使用Struts2文件上传