hdu2845

/*
分析:
    简单递推(加了种重叠的思想)(分类到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;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值