您的位置:首页 > 其它

动态规划 最大子矩阵的和

2015-06-22 20:15 169 查看
问题:最大子矩阵的和

最大子矩阵的和这个问题实际上是子串的最大和向二维空间的扩展!我们如果把每一列都看作一个数的话,实际上也是个子串的最大和问题!

不多说啦,大家看代码体会吧!

package com.liheng.algorithm;
/**
*
* @author Administrator
* 利用动态规划求最大子矩阵的问题
* 重要的一个思想是把最大子矩阵的问题转化为子串的最大和
*
* 基本思想是:先把列看成一个数,这样矩阵也是一个大的字符串
* 具体的看代码分析
* 算法复杂度为O(m^2n)
*/
public class MaxMatrix {
public static void main(String []arg)
{
MaxMatrix mma= new MaxMatrix();
int a[][]={{9,2,-6},{-4,1,-4},{-1,8,0}};
int m=3,n=3;
System.out.println(mma.MaxSum(2,2,a));

}
/**
* 动态规划求最大字段和
*/
int MaxSumDin(int n,int a[])
{
int sum=0,b=0;
for(int i=0;i<=n;i++)
{
//如果b还为整数,就可以相加,每一次都要记录b和sum的大小,以防丢失最大字段和
if(b>0)b+=a[i];
else b=a[i];
if(b>sum) sum=b;
}
return sum;
}
int MaxSum(int m,int n,int a[][] ){
int sum=0;
//定义一个一维数组b[n+1],最大子串只需要定义一个变量,因为这里要分别要记录每列的
int []b= new int[n+1];
for(int i=0;i<=m;i++)
{
for(int k=0;k<=n;k++){b[k]=0;}//给数组b赋初值
for(int j=i;j<=m;j++)
{//每一列相加赋给b数组
for(int k=0;k<=n;k++) b[k]+=a[j][k];
int max = MaxSumDin(n,b);
if(max>sum)sum=max;
}
}
return sum;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: