1. 程式人生 > >洛谷P2473||bzoj1076 [SCOI2008]獎勵關

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