NC213877. CCA的矩阵
描述
输入描述
第一行两个数 n和k 。之后的 n 行,每行 n 个数,第 i 行 第 j 个数表示在矩形的这个位置有多少只老鼠。
输出描述
一行,一个整数表示最多能清除的老鼠数量。
示例1
输入:
3 2 0 1 1 1 0 1 0 1 0
输出:
4
C++(g++ 7.5.0) 解法, 执行用时: 733ms, 内存消耗: 237176K, 提交时间: 2022-10-20 16:01:16
#include<iostream> using namespace std; #define int long long const int N=5021; int n,k; int a[N][N],b[N][N],ans; signed main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>n>>k; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) cin>>a[i][j],b[i+n-j][j+i-1]=a[i][j]; n=n*2+1; k=2*k-1; for(int i=1;i<N;i++) for(int j=1;j<N;j++) b[i][j]+=b[i][j-1]+b[i-1][j]-b[i-1][j-1]; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if((i+j-(n-1)/2)%2==0) continue; int x=i+k-1,y=j+k-1; ans=max(ans,b[x][y]-b[x][j-1]-b[i-1][y]+b[i-1][j-1]); } } cout<<ans; return 0; }
C++(clang++11) 解法, 执行用时: 480ms, 内存消耗: 136628K, 提交时间: 2021-02-24 22:42:52
#include<iostream> #include<cstring> #include<cstdio> #include<cmath> using namespace std; typedef long long ll; ll a[4100][4100]; int n,k; int main(){ scanf("%d%d",&n,&k); for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ scanf("%lld",&a[i+n-j][i+j]); } } for(int i=1;i<=2*n;i++){ for(int j=1;j<=2*n;j++){ a[i][j]+=(a[i-1][j]+a[i][j-1]-a[i-1][j-1]); } } k=2*k-1; ll cnt=0; for(int i=k;i<=2*n;i++){ for(int j=k;j<=2*n;j++){ if(i%2==(j+n)%2) cnt=max(cnt,a[i][j]-a[i-k][j]-a[i][j-k]+a[i-k][j-k]); } } printf("%lld",cnt); return 0; }