前言
明明以前做过却忘了的感觉真的超级难受,最后还是受了别人的代码启发才写出来。
一、分析
这个题是要求求最大子矩阵和,不难看出这题肯定和动态规划挂钩了,但直接二维的话肯定很难。所以这里可以先将二维压缩成一维来做(居然还能这样),我们可以按行枚举,将矩阵每一列求和,存到另一个一维数组,这样问题就变成了求最大连续字段和了,这时就是一个非常简单的问题了。
二、代码
代码如下(示例):
#include<iostream>
#include<cstring>
#include<stdio.h>
using namespace std;
const int maxn=105;
int MAX=-99999999;
int a[maxn][maxn],b[maxn];
int main()
{
int n,sum,k,i,j;
while(scanf("%d",&n)==1){
if(n==0) break;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&a[i][j]);//输入二维数组
}
}
for(i=0;i<n;i++)
{
memset(b,0,sizeof(b));//每次枚举后将b数组清0
for(j=i;j<n;j++)//从第i行~第n-1行枚举
{
for(k=0;k<n;k++)
{
b[k]+=a[j][k];//将j行到n-1行的每一列都加起来,将二维数组转换成一维,问题也就转变成了求最大连续字段和
}
sum=0;
//求最大连续字段和
for(k=0;k<n;k++)
{
if(sum+b[k]>0) sum+=b[k];
else sum=0;
if(sum>MAX) MAX=sum;
}
}
}
printf("%d\n",MAX);
}
return 0;
}
总结
代码肯定是可以再优化的,能力不够完全想不出啊啊啊啊。