题意:求一个n*n矩阵的子矩阵,使得这个子矩阵中的数字之和最大。
(1)首先考虑一个整数列,dp[ i ]表示以第 i 个 整数结尾的一列连续整数获得的最大值,那么,显然,第 i-1 个数是否在这列数中,只需判断以第 i-1 个数结尾的一列连续的数最大值是否大于0,即 dp[ i ] = MAX(dp[ i ], 0)+a[ i ], a[ i ]为第 i 个数的值。
然后对于这个矩阵,则将其压缩。
(2)从矩阵第一列开始,先将第一列进行上述的 dp 操作,记录其中获得的最大值 max;再将第一列和第二列的数相加,对新得到的一列数进行上述dp操作,记录期间的最大值,并用这个最大值与之前的max比较,更新max,如此反复,直到前n列全都相加。
(3)再从矩阵第二列开始,进行(2)操作。之后从第三列、第四列开始、..... 、直到第n列。
#include <iostream>
using namespace std;
#define N 100
int a[N][N], sum[N], n;
int main()
{
int i, j, k;
scanf("%d", &n);
for(i = 0; i < n; i++){
for(j = 0; j < n; j++)
scanf(" \n%d", &a[i][j]);
}
int ans = -1000000, dp;
for(i = 0; i < n; i++){
memset(sum, 0, sizeof(sum));
for(j = i; j < n; j++){
for(k = 0; k < n; k++)
sum[k] += a[j][k];
dp = 0;
for(k = 0; k < n; k++){
dp = dp+sum[k] > sum[k] ? dp+sum[k] : sum[k];
if(dp > ans) ans = dp;
}
}
}
printf("%d\n", ans);
return 0;
}