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

1.dp[i][j]保存到i行j列元素的最大值

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

 

魂斗罗
Star it!
Submit: 781    Accepted:257 Time 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");
   
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值