zoukankan      html  css  js  c++  java
  • codevs1068乌龟棋-四维DP,五维如何缩减一维

    我们从起点x开始暴力枚举所有决策

    于是可以得到如下转移

    void dfs(int x,int A,int B,int C,int D,int y)
    {
      if (x==n) {ans=max(ans,y);}
      if (A) dfs(x+1,A-1,B,C,D,y+a[x+1]);
      if (B) dfs(x+2,A,B-1,C,D,y+a[x+2]);
      if (C) dfs(x+3,A,B,C-1,D,y+a[x+3]);
      if (D) dfs(x+4,A,B,C,D-1,y+a[x+4]);
    }

    但是我们发现如果定义dp[A][B][C][D]为用了A,B,C,D张相应种类的牌所能达到的最大价值

    或者我实际上定义的语义是剩余cnt[1]-A,cnt[2]-B,cnt[3]-C,cnt[4]-D,张相应种类的牌所能达到的最大价值,

    那么按照我的语义,dp[A][B][C][D]=max(dp[A][B][C][D],

    max(dp[A+1][B][C][D],dp[A][B+1][C][D],dp[A][B][C+1][D],dp[A][B][C][D+1])+a[A*1+B*2+C*3+D*4+1]);千万不要丢掉1,因为唯一的起点是1

    不得不说。。样例感人。。因为我少了一个一。。默认起点是0,不明白这一点样例都过不了

    但是其实更加精髓的是如果我们这么定义dp的语义,那么我们前面的dp的位置那一维就不必考虑,从已有的四维状态能推出位置

    下面贴上180ms程序。。

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    
    using namespace std;
    int n,m;
    int a[405],cnt[5];
    int dp[41][41][41][41];
    int dfs(int A,int B,int C,int D){
        if(dp[A][B][C][D]!=-1) return dp[A][B][C][D];
        int p=0;
        if(A<cnt[1]) p=max(p,dfs(A+1,B,C,D));
        if(B<cnt[2]) p=max(p,dfs(A,B+1,C,D)); 
        if(C<cnt[3]) p=max(p,dfs(A,B,C+1,D));
        if(D<cnt[4]) p=max(p,dfs(A,B,C,D+1));
        return dp[A][B][C][D]=p+a[A*1+B*2+C*3+D*4+1];//注意!唯一的起点是1不是0
    }
    int main(){
        scanf("%d%d",&n,&m);
        int i,x;
        for(i=1;i<=n;++i) scanf("%d",a+i);
        memset(cnt,0,sizeof(cnt));
        for(i=1;i<=m;++i) {scanf("%d",&x);cnt[x]++;}
        memset(dp,-1,sizeof(dp));
        printf("%d
    ",dfs(0,0,0,0));
        return 0;
    }
  • 相关阅读:
    数据挖掘——统计学分析(五:统计量)
    数据挖掘——统计学分析(四:概率与概率分布)
    linux shell之sed
    ListView常用属性 (2012-01-12 17:20:27)
    android ListView几个比较特别的属性
    android
    android:layout_weight的真实含义
    linux下mysql安装、目录结构、配置
    mysql查看数据库和表的占用空间大小
    Android实战技巧:如何在ScrollView中嵌套ListView
  • 原文地址:https://www.cnblogs.com/linkzijun/p/6411616.html
Copyright © 2011-2022 走看看