一、题目
给一个矩阵,求这个矩阵中最大子矩阵的和
二、思路
方法:找出所有的子矩阵,对每个子矩阵进行求和,比较方法为最大子序列和
- 1、构建辅助矩阵,每列相加
- 2、遍历所有可能的子矩阵
- 3、利用求连续最大子序列的方法求和
三、代码
class Solution {
public:
vector<int> getMaxMatrix(vector<vector<int>>& matrix) {
vector<int>OutPut;
if(matrix.empty())
{
return OutPut;
}
//构建辅助矩阵,每列相加
vector<vector<int>>Help(matrix.size(),vector<int>(matrix[0].size(),0));
//第一行
for(int i=0;i<matrix[0].size();++i)
{
Help[0][i]=matrix[0][i];
}
for(int i=1;i<matrix.size();++i)
{
for(int j=0;j<matrix[i].size();++j)
{
Help[i][j]=Help[i-1][j]+matrix[i][j];
}
}
//用于存储i-j的每列之和(临时),方便进行求最大连续子序列之和
vector<int>temp(matrix[0].size(),0);
//求最大连续子序列之和所用到的dp数组
vector<int>dp(matrix[0].size(),0);
//最大和,记录行号和列号
int MaxNum=0;
vector<int>OutPut(4,0);
//遍历所有可能的子矩阵
for(int i=0;i<matrix.size();++i)
{
for(int j=i;j<matrix.size();++j)
{
//遍历列
for(int k=0;k<matrix[0].size();++k)
{
//获得当前i-j行的每列之和,从辅助矩阵Help得到
if(i>0)
{
temp[k]=Help[j][k]-Help[i-1][k];
}
else
{
temp[k]=Help[j][k];
}
//求最大连续子序列之和
if(k==0)
{
dp[0]=temp[0];
MaxNum=dp[0];
}
else
{
if(dp[k-1]>0)
{
dp[k]=dp[k-1]+temp[k];
MaxNum=MaxNum>dp[k]?MaxNum:dp[k];
}
}
}
//dp置为0
for(int m=0;m<matrix[0].size();++m)
{
dp[m]=0;
}
}
}
}
};