• 校内测试-打怪兽


    题目:

    主要算法 :  记忆化搜索

    题干:

      最长不下降链

    应试策略:  

      想到记忆化搜索,但是伪记忆化搜索,放弃了

      打爆搜,卡时间

    代码

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #define LL long long 
    #define FORa(i,s,e) for(LL i=s;i<=e;i++)
    #define FORs(i,s,e) for(LL i=s;i>=e;i--)
    #define File(name) freopen(name".in","r",stdin);freopen(name".out","w",stdout);
    #define gc pa==pb&&(pb=(pa=buf)+fread(buf,1,100000,stdin),stdin)?EOF:*pa++
    
    using namespace std;
    inline LL read();
    char buf[100000],*pa,*pb;
    
    const LL N=510,M=510;
    LL n,m,ans;
    LL t,a[N+1][M+1];
    bool vis[N+1][M+1];
    inline LL max(LL fa,LL fb) {return fa>fb?fa:fb;}
    LL mx[4]={0,0,1,-1},my[4]={1,-1,0,0};
    
    void Dfs(LL x,LL y,LL cnt)
    {
        ans=max(ans,cnt+1);
        LL fx,fy;
        FORa(i,0,3)
        {
            fx=x+mx[i],fy=y+my[i];
            if(a[fx][fy]<=a[x][y]||fx>n||fx<1||fy>m||fy<1) continue;
            vis[fx][fy]=1,Dfs(fx,fy,cnt+1),vis[fx][fy]=0,t++;
        }
    }
    int main()
    {
        File("Llll");
        n=read(),m=read();
        FORa(i,1,n) FORa(j,1,m) a[i][j]=read();
        t=m*n;
        FORs(i,n,1)
            FORs(j,m,1)
            {
                memset(vis,0,sizeof(vis)),vis[i][j]=1,Dfs(i,j,0);
                if(t>2000000)
                {
                    printf("%lld",ans);
                    return 0;
                } 
            }
        printf("%lld",ans);
        return 0;
    }
    inline LL read()
    {
        register LL x(0),f(1);register char c(gc);
        while(c<'0'||c>'9') f=c=='-'?-1:1,c=gc;
        while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=gc;
        return x*f;
    }

    非完美算法:  

      记忆化搜索

     正解:

      记忆化搜索

    #include<stdio.h>
    #include<stdlib.h>
    #define LL long long 
    #define FORa(i,s,e) for(LL i=s;i<=e;i++)
    #define FORs(i,s,e) for(LL i=s;i>=e;i--)
    #define File(name) freopen(name".in","r",stdin);freopen(name".out","w",stdout);
    #define gc pa==pb&&(pb=(pa=buf)+fread(buf,1,100000,stdin),stdin)?EOF:*pa++
    
    using namespace std;
    inline LL read();
    char buf[100000],*pa,*pb;
    
    const LL N=510,M=510;
    LL n,m,ans;
    LL a[N+1][M+1],f[N+1][M+1];
    inline LL max(LL fa,LL fb) {return fa>fb?fa:fb;}
    LL mx[4]={0,0,1,-1},my[4]={1,-1,0,0};
    
    void Dfs(LL x,LL y,LL cnt)
    {
        if(cnt>f[x][y]) f[x][y]=cnt,ans=max(cnt,ans);
        else return;
        LL fx,fy;
        FORa(i,0,3)
        {
            fx=x+mx[i],fy=y+my[i];
            if(a[fx][fy]<=a[x][y]||fx>n||fx<1||fy>m||fy<1) continue;
            Dfs(fx,fy,cnt+1);
        }
    }
    int main()
    {
        File("Llll");
        n=read(),m=read();
        FORa(i,1,n) FORa(j,1,m) a[i][j]=read();
        FORa(i,1,n)
            FORa(j,1,m) 
                Dfs(i,j,1);
        printf("%lld",ans);
        return 0;
    }
    inline LL read()
    {
        register LL x(0),f(1);register char c(gc);
        while(c<'0'||c>'9') f=c=='-'?-1:1,c=gc;
        while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=gc;
        return x*f;
    }

    总结:

      证明

  • 相关阅读:
    Linux内核RPC请求过程
    二分图
    Java实现 蓝桥杯 算法提高 合并石子
    Java实现 蓝桥杯 算法提高 合并石子
    Java实现 蓝桥杯 算法提高 摩尔斯电码
    Java实现 蓝桥杯 算法提高 摩尔斯电码
    Java实现 蓝桥杯 算法提高 文本加密
    Java实现 蓝桥杯 算法提高 文本加密
    Java蓝桥杯 算法提高 九宫格
    Java蓝桥杯 算法提高 九宫格
  • 原文地址:https://www.cnblogs.com/SeanOcean/p/11309994.html
Copyright © 2020-2023  润新知