题意:
N*N的矩阵,求出最大的子矩阵的和
题解:
最大子段和的扩展应用,最大子段和即求出一个序列中最大的连续子段的和,动态规划,dp[i]即以序列a[i]为结尾的子序列的和
dp[i]=max(dp[i-1]+a[i],a[i])
最大子矩阵求解,将最大子矩阵转变为一维的最大子段和,即对每一行i到行j求解以列和为序列的最大子段和
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 2
行0到行3,则序列为5 1 -17 3,则最大子序列和为6,最大子矩阵为
0 -2
9 2
-4 1
即列举所有起始行到终止行的序列组合,求每个组合的最大子序列和,则最大的即为结果
#include<iostream>
#include<cstring>
using namespace std;
#define N 110
int a[N][N];
int b[N];
int main(){
int r;
cin>>r;
for(int i=1;i<=r;++i)
for(int j=1;j<=r;++j)
{
cin>>a[i][j];
a[i][j]+=a[i-1][j];//前j列的和
}
int max=a[1][1];
for(int i=0;i<=r-1;++i)
for(int j=i+1;j<=r;++j)
{
memset(b,0,sizeof(b));
for(int k=1;k<=r;++k)//最大子段和
{
if(b[k-1]>=0)
b[k]=b[k-1]+a[j][k]-a[i][k];
else
b[k]=a[j][k]-a[i][k];
if(max<b[k])
max=b[k];
}
}
cout<<max<<endl;
}