题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2845
题意:求最大不连续子序列和(取了当前数字,则前一个后一个都不能取,前一行后一行也不能取)
状态转移方程:dp[i]=max(dp[i-1],dp[i-2]+dp[i])
#include <stdio.h>
#include <string.h>
#define MAXN 200002
int dp[MAXN],matr[MAXN];
int Max(int x,int y)
{
return x>y?x:y;
}
int main()
{
int n,m,i,j;
while(scanf("%d %d",&n,&m)!=EOF)
{
memset(matr,0,sizeof(matr));
for(i=1;i<=n;++i)
{
for(j=1;j<=m;++j)
scanf("%d",&matr[j]);
for(j=2;j<=m;++j)//对每行求最大不连续子序列和
matr[j]=Max(matr[j-2]+matr[j],matr[j-1]);
dp[i]=matr[m];
}
for(i=2;i<=n;++i)
dp[i]=Max(dp[i-2]+dp[i],dp[i-1]);
printf("%d\n",dp[n]);
}
return 0;
}