您的位置:首页 > 其它

最大子矩阵问题;枚举行的组合,然后利用一维最大子段和的DP算法;

2010-04-07 22:34 531 查看
#include <iostream>
using namespace std;

class Martrix
{
private:
int **martrix;//矩阵
int *b;//记录每一列的和值
int row;//行
int col;//列
int maxSum;
public:
Martrix(int row,int col)
{
martrix=new int* [row+1];
this->row=row;
this->col=col;

for(int i=0;i<=row;i++)
{
martrix[i]=new int[col+1];
}
b=new int[col+1];
maxSum=0;
}
//输入矩阵
void input()
{
for(int i=1;i<=row;i++)
{
for(int j=1;j<=col;j++)
{
cin>>martrix[i][j];
}
}
}
//一维动态规划求解最大子段和
void maxSum1()
{
int temp=0;
for(int i=col;i>=1;i--)
{
if(temp>0)
{
temp=b[i]+temp;
}
else
{
temp=b[i];
}
if(temp>maxSum)
{
maxSum=temp;
}
}
}
//二维动态规划求解最大子段和
void maxSum2()
{
for(int i=1;i<=row;i++)
{
for(int k=1;k<=col;k++)
{
b[k]=0;
}
for(int j=i;j<=row;j++)
{
for(int m=1;m<=col;m++)
{
b[m]+=martrix[j][m];
}
maxSum1();
}
}
cout<<maxSum<<endl;
}
};

void main()
{
Martrix test(4,4);
test.input();
test.maxSum2();
}


 

 给定一个n*n(0<n<=100)的矩阵,请找到此矩阵的一个子矩阵,并且此子矩阵的各个元素的和最大,输出这个最大的值。
Example:
 0 -2 -7  0
 9  2 -6  2
-4  1 -4  1
-1  8  0 -2
其中左上角的子矩阵:
 9 2
-4 1
-1 8
此子矩阵的值为9+2+(-4)+1+(-1)+8=15。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 include input