• 动态规划:高维DP


    例子当然是王八棋这道题,这道题以前是写烂了

    先来一个大暴力,zlw教的暴力~~

     1 #include<iostream>
     2 using namespace std;
     3 const int maxn=355,maxm=125;
     4 int a[maxn],b[5];
     5 int n,m;
     6 int ans=0;
     7 int MAX(int x,int y)
     8 {
     9 return x>y?x:y;
    10 }
    11 void dfs(int dp,int pos,int tmp)
    12 {
    13 ans=MAX(ans,tmp);
    14 for(int i=1;i<=4;i++)
    15 if(b[i])
    16 {
    17 b[i]--;
    18 dfs(dp+1,pos+i,tmp+a[pos+i]);
    19 b[i]++;
    20 }
    21 }
    22 int main()
    23 {
    24 cin>>n>>m;
    25 for(int i=1;i<=n;i++)
    26 cin>>a[i];
    27 for(int i=1;i<=m;i++)
    28 {
    29 int x;
    30 cin>>x;
    31 if(x==1) b[1]++;
    32 if(x==2) b[2]++;
    33 if(x==3) b[3]++;
    34 if(x==4) b[4]++;
    35 }
    36 dfs(1,1,a[1]);
    37 cout<<ans<<endl; 
    38 return 0;
    39 } 

    当时真是幼稚地连搜索都写不利索

    多维动态规划的意思就是状态有好几个维度,我们在定义状态的时候要开多维数组

    这道题里面四种卡牌用了多少了是四种可行的状态,还有一个是当前走到了哪个格子,作为阶段

    f[][][][][],然后就是这样了,MLE

    这道题的思路是把阶段这一维度压掉,因为其可以用其他的状态来表示

    一般的想法是把别的状态压掉,其实同样也能A掉这道题

    压掉状态还是自然一些,压掉阶段就不太自然了

    即使看上去很自然的样子

    总的来说,好题一道,出题人无敌

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 using namespace std;
     5 const int INF=0x7f7f7f7f;
     6 const int maxn=355,maxm=125;
     7 int n,m,a,b,c,d,ans;
     8 int t[maxn];
     9 int f[44][44][44][44];
    10 int main()
    11 {
    12     
    13     scanf("%d%d",&n,&m);
    14     for(int i=1;i<=n;i++) scanf("%d",&t[i]);
    15     int x;
    16     for(int i=1;i<=m;i++)
    17     {
    18         scanf("%d",&x);
    19         if(x==1) a++;
    20         if(x==2) b++;
    21         if(x==3) c++;
    22         if(x==4) d++;
    23     }
    24     for(int i=0;i<=a;i++)
    25         for(int j=0;j<=b;j++)
    26             for(int k=0;k<=c;k++)
    27                 for(int l=0;l<=d;l++)
    28                 {
    29                     if(i!=0) f[i][j][k][l]=max(f[i][j][k][l],f[i-1][j][k][l]);
    30                     if(j!=0) f[i][j][k][l]=max(f[i][j][k][l],f[i][j-1][k][l]);
    31                     if(k!=0) f[i][j][k][l]=max(f[i][j][k][l],f[i][j][k-1][l]);
    32                     if(l!=0) f[i][j][k][l]=max(f[i][j][k][l],f[i][j][k][l-1]);
    33                     f[i][j][k][l]+=t[i+2*j+k*3+l*4+1];
    34                 }
    35     printf("%d",f[a][b][c][d]);
    36     return 0;
    37 }

     这是一个5D/0D压成了4D/0D的动态规划?

  • 相关阅读:
    mariadb
    Linux下安装配置virtualenv与virtualenvwrapper
    配置安装源
    Redis哨兵
    Android 常用工具类之DeviceInfoUtil
    Android 常用工具类之RuntimeUtil
    android 中的几种目录
    listview 滑动以后设置最上面一行为整行展示
    Android 常用工具类之SPUtil,可以修改默认sp文件的路径
    android 在应用中切换语言
  • 原文地址:https://www.cnblogs.com/aininot260/p/9476326.html
Copyright © 2020-2023  润新知