> Description
给出一个N [2<=N<=100],并给出一个N*N的矩阵,矩阵中的数为[-127,127]之间。求出矩阵中一块子矩阵的最大和。
比如:
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
和最大的子矩阵应该是这个:
9 2
-4 1
-1 8
它的和是15。
> Input
> Output
> Sample Input
4
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-18 0 -2
> Sample Output
15
> 解题思路
这一题用到计算前缀和和动态规划
> 代码
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=101;
int ca,a,len[maxn][maxn],n,ans;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
scanf("%d",&a);
len[i][j]=len[i-1][j]+a;
//len计算列向的前缀和
}
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j++)
//枚举某一行到某一行
{
int sum=0;
for(int k=1;k<=n;k++)
{
ca=len[j][k]-len[i-1][k];
//“压缩”i行到j行的前缀和
sum+=ca;//累加
if(sum<0) sum=0;//如果为负数就清零
if(ans<sum) ans=sum;
}
}
printf("%d",ans);
return 0;
}