这道题是求最大子矩阵和。
在说最大子矩阵和前,先说另一个问题最大子序列和
关于最大子序列和的问题:
有一个证明: 那就是: 和最大的子序列 ,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,
…
对于子矩阵的列数,当求最大子序列时,就是在遍历最大子矩阵的列。
本文解析了最大子矩阵和问题,并通过将其转化为最大子序列和问题来解决。首先介绍了最大子序列和的概念及求解算法,然后详细阐述了如何通过枚举子矩阵将二维问题转化为一维最大子序列和问题。
470

被折叠的 条评论
为什么被折叠?



