虚拟赛一共就做了俩题。。。。
这道题是先算出每一行能够取道的最大值,dp[i]=Max(dp[i-2]+a[i],dp[i-3]+a[i]),然后观看每一列,我们发现求每一列的最大值也是这个状态转移公式。然后再求一遍就行了。
#include<stdio.h>
#include<string.h>
#define N 200005
int a[N],b[N];
int Max(int x,int y)
{
if(x>y)
return x;
else
return y;
}
int main()
{
int n,m;
int i,j,k;
while(scanf("%d%d",&m,&n)!=EOF)
{
k=1;
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
int x;
scanf("%d",&x);
if(j==1||j==2)
a[j]=x;
else
a[j]=Max(a[j-2]+x,a[j-3]+x);
}
if(n>1)
b[k++]=Max(a[n],a[n-1]);
else
b[k++]=a[n];
}
int max;
for(i=1;i<k;i++)
{
if(i==1||i==2)
b[i]=b[i];
else
b[i]=Max(b[i-2]+b[i],b[i-3]+b[i]);
}
if(m>=2)
max=Max(b[m],b[m-1]);
else
max=b[m];
printf("%d\n",max);
}
return 0;
}