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的主要内容,如果未能解决你的问题,请参考以下文章