啊,思路又歪了呢
题目:
胖胖的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;
}