BZOJ3208: 花神的秒题计划Ⅰ

BZOJ3208: 花神的秒题计划Ⅰ

https://lydsy.com/JudgeOnline/problem.php?id=3208

分析:

  • 暴力模拟,每次询问记忆化搜索。

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#include <set>
#include <vector>
#include <cmath>
using namespace std;
typedef long long ll;
#define N 750
int a[N][N],n,m,c[N][N],b[N][N];
char opt[10];
int f[N][N];
int tx[]={0,1,0,-1};
int ty[]={1,0,-1,0};
int dp(int x,int y) {
	if(b[x][y]>0) return 0;
	if(f[x][y]!=-1) return f[x][y];
	f[x][y]=0;
	int i;
	for(i=0;i<4;i++) {
		int dx=x+tx[i], dy=y+ty[i];
		if(dx>=1&&dx<=n&&dy>=1&&dy<=n&&a[dx][dy]<a[x][y]) {
			f[x][y]=max(f[x][y],dp(dx,dy));
		}
	}
	f[x][y]++;
	return f[x][y];
}
int main() {
	scanf("%d",&n);
	int i,j,x,y,z,w;
	for(i=1;i<=n;i++) for(j=1;j<=n;j++) scanf("%d",&a[i][j]);
	int m;
	scanf("%d",&m);
	while(m--) {
		scanf("%s",opt+1);
		if(opt[1]=='C') {
			scanf("%d%d%d",&x,&y,&z);
			a[x][y]=z;
		}else if(opt[1]=='S') {
			scanf("%d%d%d%d",&x,&y,&z,&w);
			for(i=x;i<=z;i++) for(j=y;j<=w;j++) b[i][j]=1;
		}else if(opt[1]=='B') {
			scanf("%d%d%d%d",&x,&y,&z,&w);
			for(i=x;i<=z;i++) for(j=y;j<=w;j++) b[i][j]=0;
		}else {
			for(i=1;i<=n;i++)for(j=1;j<=n;j++)f[i][j]=-1;
			int ans=0;
			for(i=1;i<=n;i++) for(j=1;j<=n;j++) {
				ans=max(ans,dp(i,j));
			}
			printf("%d\n",ans);
		}
	}
}
posted @ 2019-01-01 19:36  fcwww  阅读(159)  评论(0编辑  收藏  举报