二维前缀和:
学习地址
代码:
#include <iostream>
#include <cstring>
#include <climits>
using namespace std;
int sum[105][105];
int get(int x,int y,int n){ //x,y是子矩阵的左上角
int mx=INT_MIN,t;
for(int i=x;i<=n;i++){
for(int j=y;j<=n;j++){
t=sum[i][j]-sum[i][y-1]-sum[x-1][j]+sum[x-1][y-1];
if(t>mx)
mx=t;
}
}
return mx;
}
int main(){
int n,t;
while(scanf("%d",&n)!=EOF){
memset(sum,0,sizeof sum);
for(int i=1;i<=n;i++){ //建立矩阵的前缀和
for(int j=1;j<=n;j++){
cin>>t;
sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+t;
}
}
int mx=INT_MIN;
for(int i=1;i<=n;i++){ //暴力遍历各个子矩阵
for(int j=1;j<=n;j++){
t=get(i,j,n);
// printf("%d %d : %d\n",i,j,t);
if(t>mx)
mx=t;
}
}
cout<<mx<<endl;
}
return 0;
}
优化:
动态规划