思路:二维动态规划,先求每一行的最大和,组成新的一行,最后再求这一行的最大和
#include<stdio.h>
#include<string.h>
int r[200010][2],c[200010][2];
int max(int a,int b)
{
if(a>b)
return a;
return b;
}
main()
{
int i,j,R,C,s;
while(scanf("%d%d",&R,&C)!=EOF)
{
memset(c,0,sizeof(c));
for(i=1;i<=R;i++)
{
for(j=1;j<=C;j++)
{
scanf("%d",&s);
r[j][0]=max(r[j-1][1],r[j-1][0]);
r[j][1]=r[j-1][0]+s;
}
c[i][1]=c[i-1][0]+max(r[j-1][1],r[j-1][0]);
c[i][0]=max(c[i-1][1],c[i-1][0]);
}
printf("%d\n",max(c[i-1][1],c[i-1][0]));
}
}