Henry捡钱_DP

Henry捡钱                    

(money.pas/c/cpp)

来源:Dream Team邀请赛

【问题描述】

最近,Henry由于失恋(被某大牛甩掉!)心情很是郁闷.所以,他去了大牛家,寻求Michael大牛的帮助,让他尽快从失恋的痛苦中解脱出来.Michael大牛知道Henry是很爱钱的,所以他是费尽脑水,绞尽脑汁想出了一个有趣的游戏,帮助Henry.....

Michael感觉自己简直是个天才(我们从不这么认为),就把这个游戏取名为:Henry拣钱.为了帮助更多的人采用这种方法早日脱离失恋之苦,Michael特地选在这次DT比赛中把游戏介绍给大家...(大家鼓掌!!!)

其实,这个游戏相当垃圾,目的就是为了满足Henry这种具有强烈好钱的心理的人.游戏是这样的:Michael首先找到了一块方形的土地,面积为m*n(米^2).然后他将土地划分为一平方米大小的方形小格.Michael在每个格子下都埋有钱(用非负数s表示,表示人民币的价值为s)和炸弹(用负数s表示,表示Henry挖出该方格下的东西会花掉s的钱去看病,医炸弹炸伤的伤口)...游戏的要求就是让Henry从一侧的中间列出发,按照下图的5种方式前进(前进最大宽度为5),不能越出方格.他每到一个格子,必定要取走其下相应的东西.直到到达土地的另一侧,游戏结束.不用说也知道,Henry肯定想得到最多的人民币.所以他偷窥了,Michael埋钱的全过程,绘成了一张距阵图.由于他自己手动找会很麻烦,于是他就找到了学习编程的你.请给帮他找出,最大人民币价值.

拣钱路线规则(只有5个方向,如下图):

 

H为Henry的出发点,每组数据的出发点都是最后一行的中间位置!

 

(前方5个格子为当前可以到达的)

 

【输入文件】

 

  第一行为m n.(n为奇数),入口点在最后一行的中间

 

接下来为m*n的数字距阵.

 

共有m行,每行n个数字.数字间用空格隔开.代表该格子下是钱或炸弹.

 

为了方便Henry清算,数字全是整数.

 

【输出文件】

 

    一个数,为你所找出的最大人民币价值.

 

【输入样例】

 

6 7

 

16 4 3 12 6 0 3

 

4 -5 6 7 0 0 2

 

6 0 -1 -2 3 6 8

 

5 3 4 0 0 -2 7

 

-1 7 4 0 7 -5 6

 

0 -1 3 4 12 4 2

 

【输出样例】

 

 51

 

【数据范围】

 

  Nand M<=200.

 

  结果都在longint范围内

 

#include 
   
   
    
    
#include 
    
    
     
     

int opt[201][201]={0};
int a[201][201]={0};

int max(int a,int b)
{

       if(a>b)
       {

              return a;

       }

       else

              return b;

}

int max(int a,int b,int c)
{
       a=max(a,b);

       a=max(a,c);

       returna;
}

int max(int a,int b,int c,int d)

{

       a=max(a,b);
       a=max(a,c);
       a=max(a,d);

       return a;

}

int max(int a,int b,int c,int d,int e)
{
       a=max(a,b);
       a=max(a,c);
       a=max(a,d);
       a=max(a,e);

       return a;
}

int main()
{
       int m,n;

       scanf("%d%d",&m,&n);

       int i,j;

       for(i=m;i>=1;i--)
       {
              for(j=n;j>=1;j--)
              {
                     scanf("%d",&a[i][j]);
              }
       }
       memset(opt,0,sizeof(opt));

       int l=(n-5)/2;

       int n1=n/2+1;

       for(i=1;i<=l;i++)
       {
              for(j=n1+2+i;j<=n;j++)
              {
                     a[i][j]=-9999;
              }

              for(j=1;j<=n1-2-i;j++)
              {
                     a[i][j]=-9999;
              }
       }

       for(i=1;i<=m;i++)
       {
              for(j=1;j<=n;j++)
              {
                     printf("%d",a[i][j]);
              }
              printf("\n");
       }
       for(i=1;i<=m;i++)
       {
              for(j=1;j<=n;j++)
              {
                     if(j==1)
                     {
                         opt[i][j]=max(opt[i-1][j],opt[i-1][j+1],opt[i-1][j+2])+a[i][j];
                     }
                     if(j==2)
                     {
                            opt[i][j]=max(opt[i-1][j-1],opt[i-1][j],opt[i-1][j+1],opt[i-1][j+2])+a[i][j];
                     }

                     if(j==n)
                     {
                          opt[i][j]=max(opt[i-1][j],opt[i-1][j-1],opt[i-1][j-2])+a[i][j];
                     }
                     if(j==n-1)
                     {
                                   opt[i][j]=max(opt[i-1][j+1],opt[i-1][j],opt[i-1][j-1],opt[i-1][j-2])+a[i][j];
                     }
                     else if (j>=3&&j<=n-2)
                     {

                           opt[i][j]=max(opt[i-1][j-2],opt[i-1][j-1],opt[i-1][j],opt[i-1][j+1],opt[i-1][j+2])+a[i][j];
                     }
              }
       }
       int max=0;
       for(i=1;i<=n;i++)
       {
        if (max
     
     
    
    
   
   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值