题目链接:点击打开链接
求2维的最大字段和。
首先要知道求一维最大字段和的方法,很好百度到。
对于二维字段和,首先思路是把每行的第i,j列间的所有元素的和作为一个元素,枚举这个i,j列,然后用求一维字段和的方法求即可。
某行i,j列间的和可以预处理出来。输入时维护第i行第一列到第i列的和sum[i],这样第i列到第j列的和就是sum[j]-sum[i]
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int a[105][105];
int sum[105][105];
int main(){
int N;
while(~scanf("%d",&N)){
memset(sum,0,sizeof(sum));
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++){
scanf("%d",&a[i][j]);
if(j>1)
sum[i][j]=sum[i][j-1]+a[i][j];
else sum[i][j]=a[i][j];
}
}
int Max=-1;
for(int i=1;i<=N;i++){
for(int j=0;j<i;j++){
int cur=0;
for(int k=1;k<=N;k++){
int tmp=sum[k][i]-sum[k][j];
if(cur<=0) cur=tmp;
else cur+=tmp;
Max=max(Max,cur);
}
}
}
printf("%d\n",Max);
}
return 0;
}