P2473 || SCOI2008 奖励关 //状压&&期望DP

Posted sinxiii

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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\n",dp[1][0]);
    return 0;
}

TAG : SIN_XIII

以上是关于P2473 || SCOI2008 奖励关 //状压&&期望DP的主要内容,如果未能解决你的问题,请参考以下文章

P2473 || SCOI2008 奖励关 //状压&&期望DP

$[SCOI2008]$奖励关

[SCOI2008]奖励关

BZOJ1076 [SCOI2008]奖励关

[BZOJ 1076][SCOI2008]奖励关

BZOJ 1076 SCOI2008 奖励关