专栏文章

题解:CF173C Spiral Maximum

CF173C题解参与者 2已保存评论 1

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
1 条
当前快照
1 份
快照标识符
@miordvl2
此快照首次捕获于
2025/12/02 23:54
3 个月前
此快照最后确认于
2025/12/02 23:54
3 个月前
查看原文

思路

考虑暴力做法,枚举每个方形,时间复杂度显然 O(n4)O(n^4),CF 神机不 T 我吃。
于是优化,枚举起点边长一定优化不了,于是这只能优化求和。
仔细观察图片可以注意到,对于一个边长为 kk 的方形,除去外面两圈的部分其他中心都与边长为 k4k-4 的方形相同,于是我们就可以由 k4k-4 递推而来,外面的一圈只需进行横向前缀和与竖向前缀和即可,最后改变绘画起点的那一格。由于 n3n^3 空间复杂度有点高(我这么认为),使用滚动优化一下。

code

我是压行大师
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define F(i,x,y) for(i=x;i<=y;i++)
#define rF(i,x,y) for(i=x;i>=y;i--)
int n,m,g[505][505],dp[5][505][505],s1[505][505],s2[505][505],i,j,k,ans=-2147483647; 
signed main()
{
	cin>>n>>m;
    F(i,1,n) F(j,1,m) cin>>g[i][j],s1[i][j]=s1[i][j-1]+g[i][j],s2[i][j]=s2[i-1][j]+g[i][j],dp[1][i][j]=g[i][j];
    for(k=3;k<=min(n,m);k+=2) F(i,1,n-k+1) F(j,1,m-k+1) dp[k%3][i][j]=dp[(k-1)%3][i+2][j+2]+s1[i][j+k-1]-s1[i][j-1]+s1[i+k-1][j+k-1]-s1[i+k-1][j-1]+s2[i+k-2][j]-s2[i][j]+s2[i+k-2][j+k-1]-s2[i][j+k-1]-g[i+1][j]+(k!=3)*g[i+2][j+1],ans=max(ans,dp[k%3][i][j]);//k由k-4转移而来,在mod3下差一
    cout<<ans;
	return 0;
}

评论

1 条评论,欢迎与作者交流。

正在加载评论...