洛谷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 }