问题
求一个M*N的矩阵的最大子矩阵和。
比如
在如下这个矩阵中:
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
拥有最大和的子矩阵为:
9 2
-4 1
-1 8
其和为15。
代码
#include <bits/stdc++.h>
using namespace std;
const int maxn=100;
int max_sub_matrix(int x[][maxn], int m, int n){//二维数组传参,后面的大小不能省略
// m和n分别代表行和列
int sum = -1000000; // 选择一个足够小的数
int p[maxn]; // 开辟一个用于存放和的一维数组
int dp[maxn];
for (int i = 0; i < m; ++i){
memset(p, 0, sizeof p);
for (int j = i; j < m; ++j){
for (int k = 0; k < n; ++k){
p[k] += x[j][k]; // p[k]为第k列,从第i行到第j行的和
}
// 以下for循环等价于 sum = max(sum, max_sub_array(p, n))
dp[0] = p[0];
for (int k = 1; k < n; ++k){
dp[k] = max(dp[k - 1] + p[k], p[k]);
sum = max(sum, dp[k]);
}
}
}
return sum;
}
int main()
{
int m=4,n=4,ans;
int a[maxn][maxn]={{0,-2,-7,0},{9,2,-6,2},{-4,1,-4,1},{-1,8,0,-2}};
ans=max_sub_matrix(a,m,n);
cout<<ans<<endl;
}