BZOJ1076: [SCOI2008]奖励关

来源:互联网 发布:淘宝店铺更换类目影响 编辑:程序博客网 时间:2024/04/27 13:56

BZOJ1076: [SCOI2008]奖励关

状压Dp

题解:

http://blog.csdn.net/PoPoQQQ/article/details/43454337

对于这种最优策略的期望DP 我们一般都是从后往前推
枚举每次出现宝物 枚举此时的状态 枚举宝物是哪种
如果当前的宝物可以吃 就在吃与不吃的后继状态中选择最大值加到当前状态上
如果当前的宝物不能吃 只能选择不吃的后继状态加到当前状态上
最后输出f[1][0]就是答案

为什么一定要从后往前推呢?因为从前往后边界不好设啊。

Code:

#include <iostream>#include <cstring>#include <cstdio>#define D(x) cout<<#x<<" = "<<x<<"  "#define E cout<<endlusing namespace std;int k,n,pre[20],w[20];double f[105][1<<15];int main(){    freopen("a.in","r",stdin);    cin>>k>>n;    for(int i=1;i<=n;i++){        cin>>w[i]; int x;        while(cin>>x && x){            pre[i]|=1<<(x-1);        }    }    for(int i=k;i;i--){        for(int S=0;S<(1<<n);S++){            for(int x=1;x<=n;x++){                if((S&pre[x])==pre[x]){                    f[i][S]+=max(f[i+1][S|(1<<(x-1))]+w[x],f[i+1][S])/n;                }                else {                    f[i][S]+=f[i+1][S]/n;                }            }//          D(i); D(S); D(f[i][S]); E;        }    }    printf("%.6f\n",f[1][0]);}
原创粉丝点击