您的位置:首页 > 其它

boj 1209 魂斗罗 用简单dp解决问题

2011-04-04 23:46 309 查看
1.dp[i][j]保存到i行j列元素的最大值

地址:http://boj.me/onlinejudge/showproblem.php?problem_id=1209

魂斗罗
Star it!









Submit: 781 Accepted:257Time Limit: 1000MS Memory Limit: 65536K
Description
游戏我小时候的最爱,相信也是大家的最爱。魂斗罗便是其中一种,可在我们为它疯狂之时,是否想过去了解更多有关它的背景呢?


魂斗罗(魂斗羅 Contra)是日本Konami公司于1987年发行的街机卷轴射击游戏系列,但是后来移植到其他平台。玩家扮演特种兵,面对大量的敌人,从人和机器到异形和外星人。在战斗途中,玩家可以击落飞行的特殊目标来获得各种强化。游戏的成功卖点包括支持两个玩家同时进行游戏(双打),以及几个场景的纵深视角。
剧情:
最初的日本版剧情设定于27世纪。公元2631年,一个神秘的陨星坠落于新西兰附 近的虚构的加鲁加群岛。两年后的2633年,地球联邦政府获悉武装组织“红色猎鹰”在陨石坠落地点附近建立了军事基地并意图利用陨石内的异形开发毁灭人类 的兵器。于是,地球联邦海军陆战队派遣其所属的魂斗罗小队的上等兵比尔·雷泽(ビル・ライザー Bill Rizer,1P)和兰斯·比恩(ランス・ビーン Lance Bean,2P)前往摧毁“红色猎鹰”及异形。红色猎鹰的标志在游戏中表现为运载强化武器的工具。
秘技:
游戏的秘技也就是著名的柯拿米秘技,是在标题画面出现之前依次按“上上下下左右左右BA”(美版需再追加一次BA,即上上下下左右左右BABA),然后选择玩家数目,之后按开始按钮。如果输入成功,玩家的初始生命数会从3增至30。这个秘技最初出现于Konami公司的游戏グラディウス中,后来在Konami公司的其他游戏中继续使用,例如魂斗罗和グラディウス的续作沙罗曼蛇。

konami 公司为了把这个游戏得到更大的推广于是该公司决定来开展一次促进活动。
活动内容: 任何一个人都可以报名参加 , 报名参加的选手需要先闯过该游戏的每一关,
然后找数字拿奖品 。 找数字的的规则如下:
数字分布在一个 R X C ( 1 <= R , C <= 100 ) 的矩形方阵里,这个方阵里含有R X C 个小的正方形的小纸片,每个正方行纸片上都标有一个数 number
( 0 <= number <= 100 ) 选手只能从这个方阵的左侧进入该方阵并向右侧前进,前进时只能由当前所在的方格走到与它相邻的三个格子里面如 :
( i , k ) -> ( i , k + 1 ) , ( i - 1 , k + 1 ) , ( i + 1 , k+ 1 )
他经过每个格子时就可以把这个格子加到自己的总分里去,这样他从右侧出来后就有个得分,公司会按照选手的得分情况来分发奖品,当然分数最高的拿到的奖品就最好了,问题就是怎样才能拿到最高的分数呢?

Input
多个测试用例 每个测试用例包含两部分
第一部分 : 一行 两个正整数 R , C ;
第二部分 : R 行 C 列 个整数 ;

Output
一个整数最后可能的到的最高分 。

Sample Input

2 3
2 3 4
5 6 7

Sample Output

18

Source
Dreamzk

#include<iostream>
using namespace std;
//int a[110][110];
int dp[110][110];
int max(int a,int b)
{
if(a>b)
return a;
else
return b;
}
int maxt(int a,int b,int c)
{
if(a>=b&&a>=c)
return a;
else if(b>=a&&b>=c)
return b;
else
return c;

}
int main()
{
int r,c,i,j;
while(scanf("%d%d",&r,&c)!=EOF)
{
int maxc=0;
int a[r][c];
// int dp[r][c];
for(i=0;i<r;i++)
for(j=0;j<c;j++)
scanf("%d",&a[i][j]);

for(i=0;i<r;i++)
dp[i][0]=a[i][0];
for(j=1;j<c;j++)
for(i=0;i<r;i++)
{
if(i==0)
{
dp[i][j]=max(dp[i][j-1],dp[i+1][j-1])+a[i][j];

}
else if(i==r-1)
{
dp[i][j]=max(dp[i-1][j-1],dp[i][j-1])+a[i][j];
}
else
{
dp[i][j]=maxt(dp[i-1][j-1],dp[i][j-1],dp[i+1][j-1])+a[i][j];
}
}
maxc=dp[0][c-1];
for(i=0;i<r;i++)
{
if(dp[i][c-1]>maxc)
maxc=dp[i][c-1];
}

printf("%d/n",maxc);
for(i=0;i<r;i++)
for(j=0;j<c;j++)
{
a[i][j]=0;
dp[i][j]=0;
}

}
system("pause");

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: