• 乌龟棋


    多维的搜索,由爆搜,到dp演化一下。

    搜索

    
    
    #include<iostream>
    #include<cstdio>
    #include<string>
    #include<cstring>
    #include<algorithm>
    #include<vector>
    #include<queue>
    #include<math.h>
    using namespace std;
    int m,n,a[400],qi[5],ans;
    void dfs(int x,int y)
    {
        if(x==n)    {ans=max(y,ans);return;}
        for(int i=1;i<=4;i++)
        if(qi[i])    
            {
                qi[i]--;
                dfs(x+i,y+a[x]);
                qi[i]++;
            }
        return ;
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
            int c;
        for(int i=1;i<=m;i++)
            scanf("%d",&c),qi[c]++;
        dfs(1,a[n]);
        cout<<ans;
        return 0;
    }
    
    
    
    #include<iostream>
    #include<cstdio>
    #include<string>
    #include<cstring>
    #include<algorithm>
    #include<vector>
    #include<queue>
    #include<math.h>
    using namespace std;
    int m,n,a[400],qi[5],ans,t[40][40][40][40];
    int dfs(int x,int y1,int y2,int y3,int y4)
    {
        if(x==n)    {return a[n];}
        if(t[y1][y2][y3][y4])    return t[y1][y2][y3][y4];
        int c=-1111;    
        if(y1)        
                c=max(c,dfs(x+1,y1-1,y2,y3,y4));
            
        if(y2)
                c=max(c,dfs(x+2,y1,y2-1,y3,y4));
        
        if(y3)            
                c=max(c,dfs(x+3,y1,y2,y3-1,y4));
        
        if(y4)            
                c=max(c,dfs(x+4,y1,y2,y3,y4-1));
        
        return t[y1][y2][y3][y4]=c+a[x];
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
            int c;
        for(int i=1;i<=m;i++)
            scanf("%d",&c),qi[c]++;
        ans=dfs(1,qi[1],qi[2],qi[3],qi[4]);
        cout<<ans;
        return 0;
    }
    dp
    #include<iostream>
    #include<cstdio>
    #include<string>
    #include<cstring>
    #include<algorithm>
    #include<vector>
    #include<queue>
    #include<math.h>
    using namespace std;
    int m,n,a[400],qi[5],ans,t[40][40][40][40];
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
            int c;
        for(int i=1;i<=m;i++)
            scanf("%d",&c),qi[c]++;
        f[0][0][0][0]=a[1];    
        for(int i1=0;i1<=qi[1];i1++)
        for(int i2=0;i2<=qi[2];i2++)
        for(int i3=0;i3<=qi[3];i3++)
        for(int i4=0;i4<=qi[4];i4++)
        {
            int x,tt=0;
            x=a[i1*1+i2*2+i3*3+i4*4+1];
            if(i1)
                tt=max(t[i1-1][i2][i3][i4],tt);
            if(i2)
                tt=max(t[i1][i2-1][i3][i4]+x,tt);
            if(i3)
                t[i1][i2][i3][i4]=max(t[i1][i2][i3-1][i4]+x,t[i1][i2][i3][i4]);
            if(i4)
                t[i1][i2][i3][i4]=max(t[i1][i2][i3][i4-1]+x,t[i1][i2][i3][i4]);
        }
        cout<<t[qi[1]][qi[2]][qi[3]][qi[4]]+a[1];
        return 0;
    }
  • 相关阅读:
    Python核心编程 练习
    python学习
    mongo查询某个字段是否存在,并删除记录里的这个字段
    python打印详细的异常信息
    tornadoioloop.py单例
    python int异常 python isdigit
    【Apache ZooKeeper】命令行zkCli.sh使用指南
    安装mysql-python报错:UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 65: ordinal not in range(128)
    pydev去掉右边的预览栏minimap
    python中staticmethod classmethod及普通函数的区别
  • 原文地址:https://www.cnblogs.com/CLGYPYJ/p/6378377.html
Copyright © 2020-2023  润新知