这个dp有点日怪哈

   啊,思路又歪了呢

题目:

胖胖的ZSer学长最近在减肥,不能吃零食,可是看着零食不能吃实在太痛苦了。正好小学妹来找他玩,他想了想便有了一个好主意,他准备和小学妹一起玩个游戏"顺便"可以吃点零食。游戏规则是这样的,每个人都有一个M*N的矩阵,里面每个格子都放着一些。现在ZSer学长想吃尽可能多的零食,但是每个人都要遵循下列游戏规则:如果在(x,y)吃了零食,就不能在x-1行,x+1行,(x,y-1),(x,y+1)上吃零食了。

问题来了,胖胖学长最多能吃多少零食?毕竟小学妹也不是天天都来找他玩

测试数据有多组,对于每组测试数据:

 

输入M(行)和N(列),接下来的M行每行包括N个整数,表示零食的数量。每格的零食数不超过1000,并且1<=M*N<=200000.

 

输入M(行)和N(列),接下来的M行每行包括N个整数,表示零食的数量。每格的零食数不超过1000,并且1<=M*N<=200000.

 

Output

对于每组测试数据:

 

输出能够吃到的最多零食数

 

Sample Input Copy

4 6
11 0 7 5 13 9
78 4 81 6 22 4
1 40 9 34 16 10
11 22 0 33 39 6
7 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9

Sample Output Copy

242
100

题意:

  开始自以为是的跳着走就是隔一列加一次,结局当然是wa wa wa咯,因为只要不是它的上一排,他都选择最大的去吃。所以朱儿姐说直接 把最大值赋在一行的最后一个就好,因此就直接取 i-1 的值或者是 i-2 ,而列数也是一样的,最后我们得到的答案就是用列数数组的最后一个

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std ;

long long  ss[200040],dp2[200040];
long long  dp[200040],maxx;
int main()
{
    int m,n;
    while(~scanf("%d%d",&m,&n))
    {
        memset(dp,0,sizeof(dp));
        memset(dp2,0,sizeof(dp2));
        maxx=0;
        for(int i=1; i<=m; i++)
        {
            for(int j=1; j<=n; j++)
            {
                scanf("%d",&ss[j]);
                if(j>=2)
                dp[j] = max(dp[j-1],dp[j-2]+ss[j]);
                else
                dp[j]=ss[j];
            }
            if(i>=2)
                dp2[i] = max(dp2[i-1],dp2[i-2]+dp[n]);
            else
                dp2[i]=dp[n];
        }
        printf("%d\n",dp2[m]);
    }
    return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值