• 动态规划:高维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的动态规划?

  • 相关阅读:
    CSS3 target伪类简介
    不用position,让div垂直居中
    css3 在线编辑工具 连兼容都写好了
    a标签伪类的顺序
    oncopy和onpaste
    【leetcode】1523. Count Odd Numbers in an Interval Range
    【leetcode】1518. Water Bottles
    【leetcode】1514. Path with Maximum Probability
    【leetcode】1513. Number of Substrings With Only 1s
    【leetcode】1512. Number of Good Pairs
  • 原文地址:https://www.cnblogs.com/aininot260/p/9476326.html
Copyright © 2020-2023  润新知