/*
分析:
简单递推(加了种重叠的思想)(分类到DP里面吧),今儿
第二个1Y了~
吓尿了,一开始看成1<=M、N<=200000,怎么优化都不可能
(光输入就要TLE。。。)
《压缩元素,借助递推》
首先,对于每一行,求出如果从这行挑元素(因为某个元素
被挑的话,它的上下行都不可以再被挑,而自身所在的那行还有
元素可以挑),可以得到的sum[i],这样“就把这行m个数压缩为
一个元素了”;
那么,对于n行都进行上面说的压缩(进行了n次),再竖着
这对着n个小sum进行一次同样的压缩,那么就得到了一个大SUM,
亦即ans。
这题应该就是重在启发这个压缩、在不影响所需性质的条件
下,将多个小元素合并为一个稍微大一点儿的元素吧囧~~~(然后
类,如果把这个题当成2维的,那么可以假设有一个题是n维的,
n可以是很大。。很大。。。)
2013-03-14
*/
分析:
简单递推(加了种重叠的思想)(分类到DP里面吧),今儿
第二个1Y了~
吓尿了,一开始看成1<=M、N<=200000,怎么优化都不可能
(光输入就要TLE。。。)
《压缩元素,借助递推》
首先,对于每一行,求出如果从这行挑元素(因为某个元素
被挑的话,它的上下行都不可以再被挑,而自身所在的那行还有
元素可以挑),可以得到的sum[i],这样“就把这行m个数压缩为
一个元素了”;
那么,对于n行都进行上面说的压缩(进行了n次),再竖着
这对着n个小sum进行一次同样的压缩,那么就得到了一个大SUM,
亦即ans。
这题应该就是重在启发这个压缩、在不影响所需性质的条件
下,将多个小元素合并为一个稍微大一点儿的元素吧囧~~~(然后
类,如果把这个题当成2维的,那么可以假设有一个题是n维的,
n可以是很大。。很大。。。)
2013-03-14
*/
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
const int N=200111;
int n,m; //反过来了,按照我的习惯,n做行、m做列
int F[N],a[N],b[N];
int MAX(int a,int b){
return a>b?a:b;
}
int main()
{
int i,l;
int temp;
while(scanf("%d%d",&n,&m)!=-1)
{
//横向处理
for(i=1;i<=n;i++) //从1开始循环
{
//注意,不能用memset哦
a[0]=b[0]=0;
for(l=1;l<=m;l++) //小心有复数
{
scanf("%d",&temp);
a[l]=MAX(a[l-1],b[l-1]); //保证a[l]一定是到l为止,不吃l所能达到的最大值
b[l]=a[l-1]+temp; //但是,对于b[l],是无法保证的(如果每个格子的val都>=0,那么可以保证)
}
F[i]=MAX(a[m],b[m]);
}
//纵向处理
a[0]=b[0]=0;
for(i=1;i<=n;i++)
{
a[i]=MAX(a[i-1],b[i-1]);
b[i]=a[i-1]+F[i];
}
printf("%d\n",MAX(a[n],b[n]));
}
return 0;
}