zoukankan      html  css  js  c++  java
  • bzoj1076

    第一次写期望dp 略坑

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<cmath>
     4 #include<ctime>
     5 #include<cstdlib>
     6 #include<iostream>
     7 #include<algorithm>
     8 #define clr(a,x) memset(a,x,sizeof(a))
     9 #define rep(i,l,r) for(int i=l;i<r;i++)
    10 #define b(a) (1<<(a))
    11 using namespace std;
    12 int read()
    13 {
    14     char c=getchar();
    15     int ans=0,f=1;
    16     while(!isdigit(c)){
    17         if(c=='-') f=-1;
    18         c=getchar();
    19     }
    20     while(isdigit(c)){
    21         ans=ans*10+c-'0';
    22         c=getchar();
    23     }
    24     return ans*f;
    25 }
    26 const int maxn=16,maxk=102;
    27 double dp[maxk][b(maxn)];
    28 int v[maxn],q[maxn];
    29 int main()
    30 {
    31     clr(dp,0);
    32     int k=read(),n=read();
    33     rep(i,0,n){
    34         v[i]=read();
    35         q[i]=0;
    36         int t=read();
    37         while(t){
    38             q[i]|=b(t-1);
    39             t=read();
    40         }
    41     }
    42     for(int i=k-1;i>=0;i--){
    43         rep(j,0,b(n)){
    44             rep(l,0,n){
    45                 if((j&q[l])==q[l])
    46                     dp[i][j]+=max(dp[i+1][j|b(l)]+v[l],dp[i+1][j]);
    47                 else dp[i][j]+=dp[i+1][j];
    48             }
    49             dp[i][j]/=n;
    50         }
    51     }
    52     printf("%.6lf",dp[0][0]);
    53     return 0;
    54 }
    View Code

    1076: [SCOI2008]奖励关

    Time Limit: 10 Sec  Memory Limit: 162 MB
    Submit: 1112  Solved: 642
    [Submit][Status][Discuss]

    Description

    你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关。在这个奖励关里,系统将依次随机抛出k次宝物,每次你都可以选择吃或者不吃(必须在抛出下一个宝物之前做出选择,且现在决定不吃的宝物以后也不能再吃)。 宝物一共有n种,系统每次抛出这n种宝物的概率都相同且相互独立。也就是说,即使前k-1次系统都抛出宝物1(这种情况是有可能出现的,尽管概率非常小),第k次抛出各个宝物的概率依然均为1/n。 获取第i种宝物将得到Pi分,但并不是每种宝物都是可以随意获取的。第i种宝物有一个前提宝物集合Si。只有当Si中所有宝物都至少吃过一次,才能吃第i种宝物(如果系统抛出了一个目前不能吃的宝物,相当于白白的损失了一次机会)。注意,Pi可以是负数,但如果它是很多高分宝物的前提,损失短期利益而吃掉这个负分宝物将获得更大的长期利益。 假设你采取最优策略,平均情况你一共能在奖励关得到多少分值?

    Input

    第一行为两个正整数k和n,即宝物的数量和种类。以下n行分别描述一种宝物,其中第一个整数代表分值,随后的整数依次代表该宝物的各个前提宝物(各宝物编号为1到n),以0结尾。

    Output

    输出一个实数,保留六位小数,即在最优策略下平均情况的得分。

    Sample Input

    1 2
    1 0
    2 0

    Sample Output

    1.500000

    HINT

    【数据规模】

    1<=k<=100,1<=n<=15,分值为[-10^6,10^6]内的整数。

    Source

     
    [Submit][Status][Discuss]
  • 相关阅读:
    hdu 1576 A/B(exgcd、乘法逆元+整数快速幂)
    CSS3带小图标垂直下拉菜单
    CSS3动画表单
    灰色3D按钮组合
    半透明菜单导航
    CSS3透明背景表单
    CSS3手风琴菜单 可同时折叠多个菜单
    jQuery图片下滑切换焦点图
    jQuery消息提示框插件Tipso
    jQuery自动轮播图片焦点图
  • 原文地址:https://www.cnblogs.com/chensiang/p/4654082.html
Copyright © 2011-2022 走看看