• 【bzoj3208】花神的秒题计划Ⅰ


    记忆化搜索

    #include<algorithm>
    #include<iostream> 
    #include<cstring>
    #include<cstdlib> 
    #include<cstdio>
    #include<cmath> 
    #include<queue>  
    using namespace std;
     
    typedef long long LL;
     
    #define INF 0x7fffffff
    #define N 710
     
    int n,m;
    int aa,bb,cc,dd;
     
    int xx[4]={0,0,1,-1},
        yy[4]={1,-1,0,0};
     
    int a[N][N],f[N][N];
     
    char ch[2];
     
    bool v[N][N];
    int read()
    {
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    void change(int x,int y,int val)
    {
        a[x][y]=val;
    }
     
    void mark(int aa,int bb,int cc,int dd,bool f)
    {
        for (int i=aa;i<=bb;i++)
            for (int j=cc;j<=dd;j++)
                v[i][j]=f;
    }
     
    int dfs(int x,int y)
    {
        if (v[x][y])
            return -INF;
        if (f[x][y]!=-1)
            return f[x][y];
        f[x][y]=1;
        for (int i=0;i<4;i++)
        {
            int tx=x+xx[i],
                ty=y+yy[i];
            if (tx<1 || ty<1 || tx>n || ty>n)
                continue;
            if (a[x][y]>a[tx][ty])
                f[x][y]=max(f[x][y],dfs(tx,ty)+1);
        }
        return f[x][y];
    }
     
    int main()
    {
        scanf("%d",&n);
        for (int i=1;i<=n;i++)
            for (int j=1;j<=n;j++)
                scanf("%d",&a[i][j]);
        scanf("%d",&m);
        while (m--)
        {
            scanf("%s",ch);
            if (ch[0]=='C')
            {
                scanf("%d%d%d",&aa,&bb,&cc);
                change(aa,bb,cc);
            }
            if (ch[0]=='S')
            {
                scanf("%d%d%d%d",&aa,&cc,&bb,&dd);
                mark(aa,bb,cc,dd,1);
            }
            if (ch[0]=='B')
            {
                scanf("%d%d%d%d",&aa,&cc,&bb,&dd);
                mark(aa,bb,cc,dd,0);
            }
            if (ch[0]=='Q')
            {
                int maxn=0;
                memset(f,-1,sizeof(f));
                for (int j=1;j<=n;j++)
                    for (int k=1;k<=n;k++)
                        maxn=max(maxn,dfs(j,k));
                printf("%d
    ",maxn);
            }
        }
        return 0;
    }
    

      

  • 相关阅读:
    关于extern的用法
    建立CMenu菜单项,实现选中菜单项点击左键响应事件
    数据库常用语句
    圆周率的计算
    C++11中list特有版本的算法
    使用istream迭代器来输入输出数据
    C++中函数重载和函数覆盖的区别
    外置接口请求
    JSON转指定复杂对象
    FastDFS优化
  • 原文地址:https://www.cnblogs.com/yangjiyuan/p/5547148.html
Copyright © 2020-2023  润新知