洛谷P2473||bzoj1076 [SCOI2008]奖励关

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

https://www.lydsy.com/JudgeOnline/problem.php?id=1076

不会。。

以为是求最大得分的期望(当然要求自己在做第一个决策之前就知道系统每一次要抛的结果),然而看了题解貌似是要求最大的期望得分?然后一看题面是“必须在抛出下一个宝物之前选择”,意思就是选择的时候你不知道系统后面怎么抛,显然不可能是我那个理解。。。

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<vector>
 5 using namespace std;
 6 #define fi first
 7 #define se second
 8 #define mp make_pair
 9 #define pb push_back
10 typedef long long ll;
11 typedef unsigned long long ull;
12 typedef pair<int,int> pii;
13 int K,n;
14 int a[20],b[20];
15 double an[101][65536];//an[i][j]表示1-i次抛出,j内已经抛过,到目标状态的最大期望
16 //目标状态:i=n:进行完了1-n次抛出,j任意
17 //转移:考虑第i+1次抛出为p
18 //an[i][j]=sigma{转移p}/n
19 //如果p不依赖j以外的:那么转移为max(an[i+1][j|p]+a[p],an[i+1][j])
20 //否则转移为an[i+1][j]
21 int s;
22 int main()
23 {
24     int i,j,k,t;
25     scanf("%d%d",&K,&n);s=(1<<n)-1;
26     for(i=1;i<=n;++i)
27     {
28         scanf("%d",&a[i]);
29         while(1)
30         {
31             scanf("%d",&t);
32             if(!t)    break;
33             b[i]|=(1<<(t-1));
34         }
35     }
36     for(i=K-1;i>=0;--i)
37     {
38         for(j=0;j<=s;++j)
39         {
40             for(k=1;k<=n;++k)
41             {
42                 if(!(b[k]&(s&(~j))))
43                     an[i][j]+=max(an[i+1][j|(1<<(k-1))]+a[k],an[i+1][j]);
44                 else
45                     an[i][j]+=an[i+1][j];
46             }
47             an[i][j]/=n;
48         }
49     }
50     printf("%.6f\n",an[0][0]);
51     return 0;
52 }
View Code

 

posted @ 2018-11-06 18:58  hehe_54321  阅读(116)  评论(0编辑  收藏  举报
AmazingCounters.com