hdu 1081 To The MAX

本文解析了最大子矩阵和问题,并通过将其转化为最大子序列和问题来解决。首先介绍了最大子序列和的概念及求解算法,然后详细阐述了如何通过枚举子矩阵将二维问题转化为一维最大子序列和问题。

这道题是求最大子矩阵和。
在说最大子矩阵和前,先说另一个问题最大子序列和
关于最大子序列和的问题

有一个证明: 那就是: 和最大的子序列 ,ai1,ai2,….aj。 i<=j
其开头元素必定不小于0 , 可以通过反证法,如果开头元素(第一个)小于0 ,那么把这个元素去掉的子序列的和必定大于原来序列的和,和原先序列和最大相悖。故得证。

根据以上证明,可以求最大子序列。

sum= dp[k]   sum<0 (如果sum小于0,则把和为sum这段序列舍弃,从dp[k】从新开始序列)
      sum+dp[k]  sum>=0

故求最大子序列和的算法如下:

for(int k=0;k<n;k++){

      if(sum<0){

          sum=dp[k];
      }else{
          sum+=dp[k];
      }
      //sum=sum<0?dp[k]:sum+dp[k];
      //this step is very important
      if(sum>mx)mx=sum;
}

接着说最大子矩阵和的问题,求最大子矩阵和的思想就是把二维化为一维,转变成求最大子序列和的问题。
看看是如何转化的。

首先列举所有子矩阵, 子矩阵的行数,i,可以是1,到n, 列也可以是1,n
比如

1 1 1
2 2 2
3 3 3
则它的子矩阵的行数可以是 1 时
111 ,222,333
行数是2时,可以是
111
222 ,

111
333 ,

222
333,

对于子矩阵的列数,当求最大子序列时,就是在遍历最大子矩阵的列。

参考博客: http://www.lai18.com/content/607370.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值