zoukankan      html  css  js  c++  java
  • P2473 || SCOI2008 奖励关 //状压&&期望DP

    https://www.luogu.org/problemnew/show/P2473

    一句话题意:有n种宝物,捡起会有得分(可能为负),有k轮可以捡起宝物.其中有些宝物,需要另外的宝物捡起过才能捡起.

    问采取最优策略的期望得分.

    :期望的最大特点在于难写的递推式和倒序DP

    但这道题没那么恶心,递推式还是挺好写的(指看完题解之后可以自己写出DP式子)

    f[i][S]表示在第1轮到第i-1轮内宝物是否取过的状态为S,第i轮到第K轮的最大期望得分

    f [ i ][ S ] 在S满足时可以取或不取 f[ i ][ S ] =max( f[ i + 1 ] [ S ] ,  f [ i+1 ][ S | (1<<(j-1))] + a[j])

    不满足时只可以不拿即f[i][S]=f[i+1]

    中间的各个状态要在什么时候除以n有点恶心,要好好想想.

    下配AC代码:

    #include<bits/stdc++.h>
    
    using namespace std ;
    
    const int MAXN=300;
    int K,n,a[30],b[30];
    double dp[105][33000];
    
    int main(){
        scanf("%d%d",&K,&n);
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
            while(1){
                int tra1=0;
                scanf("%d",&tra1);
                if(!tra1) break;
                else b[i]=b[i]|(1<<(tra1-1));
            }
        }
    //    for(int i=1;i<=n;i++){
    //        cout<<b[i]<<endl;
    //    }
        for(int i=K;i>=1;i--){//diao luo ci shu
            for(int j=0;j < (1<<n);j++){//mei zhong zhuang tai
                for(int k=1;k<=n;k++){//mei zhong bao wu
                    if( (j & b[k]) == b[k] ) {
                        dp[i][j] += max(dp[i + 1][j],dp[i + 1][j | (1<<(k - 1))] + a[k]);
                    }
                    else dp[i][j]+=dp[i + 1][j];
                }
                dp[i][j]/=n;
            }
        }
        printf("%.6lf
    ",dp[1][0]);
        return 0;
    }

    TAG : SIN_XIII

  • 相关阅读:
    001 分布式系统
    024 RabbitTemplate组件
    023 RabbitAdmin组件
    022 spring与Rabbitmq整合
    011 mandatory参数
    这样自己组装数据,醉了,
    cool,
    swift,
    page enable,
    构建 HTTPserver,
  • 原文地址:https://www.cnblogs.com/SINXIII/p/10807777.html
Copyright © 2011-2022 走看看