首页 > 其他 > 详细

BZOJ3208: 花神的秒题计划Ⅰ

时间:2019-01-01 20:20:50      阅读:149      评论:0      收藏:0      [点我收藏+]

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

BZOJ3208: 花神的秒题计划Ⅰ

原文:https://www.cnblogs.com/suika/p/10205659.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!