zoukankan      html  css  js  c++  java
  • 乌龟棋

    多维的搜索,由爆搜,到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;
    }
  • 相关阅读:
    css3中calc()使用
    垂直居中
    QLineEdit IP地址校验
    UML类图几种关系的总结(网摘)
    如何解压 Mac OS X 下的 PKG 文件(网摘)
    %appdata%目录下配置文件修改
    文件字符串替换
    Qt版权符号显示问题
    Mac OS X 终端命令开启功能
    Qt 无边框拖拽实现
  • 原文地址:https://www.cnblogs.com/CLGYPYJ/p/6378377.html
Copyright © 2011-2022 走看看