题目大意:有一个n*n的二维矩阵,求出最大子矩阵的和。
思路:
(1)对于一维数列a1,a2,a3,a4,......,an,以第i个数结尾的字段和dp[i] = num[i] + max(dp[i-1], 0)
(2)对于二维矩阵,枚举不同的列,然后视为一维数列求最大字段和的问题。
#include <iostream>
#include <cstdio>
#include <climits>
using namespace std;
int map[105][105],dp[105];
int main()
{
int n,i,j,k,tmp,ans;
while (scanf("%d",&n)==1)
{
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
{
scanf("%d",&tmp);
map[i][j]=map[i][j-1]+tmp;
}
ans=INT_MIN;
for (i=1;i<=n;i++)
for (j=i;j<=n;j++)
for (k=1;k<=n;k++)
{
dp[k]=map[k][j]-map[k][i-1]+max(0,dp[k-1]);
ans=max(ans,dp[k]);
}
printf("%d\n",ans);
}
return 0;
}