记录编号 |
607142 |
评测结果 |
AAAAA |
题目名称 |
3971.不重叠正方形 |
最终得分 |
100 |
用户昵称 |
梦那边的美好BP |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
1.882 s |
提交时间 |
2025-10-07 08:04:09 |
内存使用 |
34.04 MiB |
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N=1003;
int n,m;
ll arr[N][N],s[N][N];
ll sk[N][N],a[N][N],b[N][N],c[N][N],d[N][N];
ll ans=0;
int main() {
// freopen("zfx.in","r",stdin);
// freopen("zfx.out","w",stdout);
cin>>n>>m;
for(int i=1; i<=n; i++) {
for(int j=1; j<=n; j++) {
cin>>arr[i][j];
s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+arr[i][j];
}
}
for(int i=m;i<=n;i++){
for(int j=m;j<=n;j++){
sk[i][j]=s[i][j]-s[i][j-m]-s[i-m][j]+s[i-m][j-m];
}
}
for(int i=m;i<=n;i++){
for(int j=m;j<=n;j++){
a[i][j]=max(sk[i][j],max(a[i][j-1],a[i-1][j]));
}
}
for(int i=m;i<=n;i++){
for(int j=n-m+1;j>=1;j--){
b[i][j]=max(sk[i][j+m-1],max(b[i-1][j],b[i][j+1]));
}
}
for(int i=n-m+1;i>=1;i--){
for(int j=m;j<=n;j++){
c[i][j]=max(sk[i+m-1][j],max(c[i+1][j],c[i][j-1]));
}
}
for(int i=n-m+1;i>=1;i--){
for(int j=n-m+1;j>=1;j--){
d[i][j]=max(sk[i+m-1][j+m-1],max(d[i+1][j],d[i][j+1]));
}
}
ll ans=0;
for(int i=m;i<=n;i++)
for(int j=m;j<=n;j++){
ans=max(ans,a[i-m][n]+sk[i][j]+c[i+1][n]);
ans=max(ans,a[n][j-m]+sk[i][j]+b[n][j+1]);
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
ans=max(ans,a[i][j]+b[i][j+1]+c[i+1][n]);
ans=max(ans,a[i][n]+c[i][j]+d[i+1][j+1]);
ans=max(ans,a[i][j]+b[n][j+1]+c[i+1][j]);
ans=max(ans,a[n][j]+b[i][j+1]+d[i+1][j+1]);
}
}
cout<<ans;
return 0;
}