题目地址:点击打开链接
思路:参考了别人的思想,开了四个数组A了,想想其实开3个数组就行了,结果看大神的代码开了2个直接A了,没看懂。其实这道题先横着求每行的最大不连续子序列,再竖着求每行的最大不连续子序列就行了,每行的最大不连续子序列考虑了所有的吃豆方式如1,2,3,4,如由1到4的吃豆方式是这一行最大的连续子序列,刚开始还没太想明白,照着递推方程想一下就清楚了,总结一下就是横竖分别求一下不连续的最大字段和
AC代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <cstring>
#include <climits>
#include <cmath>
using namespace std;
const int maxn = 200010;
int a[maxn],b[maxn],c[maxn],dp[maxn];
int m,n;
int main()
{
int i,j;
while(scanf("%d%d",&m,&n) != EOF)
{
for(i=1; i<=m; i++)
{
for(j=1; j<=n; j++)
{
scanf("%d",&a[j]);
}
b[0] = 0;
b[1] = a[1];
for(j=2; j<=n; j++)
{
b[j] = max(b[j-2] + a[j],b[j-1]);
}
c[i] = b[n];
}
dp[0] = 0;
dp[1] = c[1];
for(i=2; i<=m; i++)
{
dp[i] = max(dp[i-2] + c[i],dp[i-1]);
}
printf("%d\n",dp[m]);
}
return 0;
}
大神地址: 点击打开链接