题目
输入输出
思路
f[i][j]:以a[i][j]为右下角a[1][1]为左上角的矩阵的和
计算公式:f[i][j]=a[i][j]+f[i-1][j]+f[i][j-1]-f[i-1][j-1]
代码
#include <bits/stdc++.h>
using namespace std;
#define N 205
int a[N][N];
int f[N][N];
int n,k;
int solve(int n,int k){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++) cin>>a[i][j];
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
f[i][j]=a[i][j]+f[i-1][j]+f[i][j-1]-f[i-1][j-1];
}
}
int mx=0;
for(int i=k;i<=n;i++){
for(int j=k;j<=n;j++){
int t=f[i][j]-f[i-k][j]-f[i][j-k]+f[i-k][j-k];//反推a[i][j]
mx=max(mx,t);
}
}
return mx;
}
int main(){
while(cin>>n>>k){
memset(a,0,sizeof a);
memset(f,0,sizeof f);
cout<<solve(n,k)<<endl;
}
return 0;
}