1. 程式人生 > >BZOJ3208: 花神的秒題計劃Ⅰ

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);
        }
    }
}