Codeforces Gym 100338I TV Show DFS
题目链接:
http://codeforces.com/gym/100338/attachments
题意:
一个人去参加电视有奖问答的节目,初始奖金为100元,每答对一道问题奖金翻倍,答错奖金清零。此外有一次保险机会:花费C的奖金,下一题可以答对奖金翻倍,答错奖金不清零。
现在给你答对每道题的概率,求最优答题策略的奖金期望。
题解:
http://blog.csdn.net/qq_15714857/article/details/48035161
枚举到第i题前离开 , 并且在第k题(k小于i)使用保险,注意k可以等于0,表示 不用
代码:
code 1:
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 #define MS(a) memset(a,0,sizeof(a)) 5 #define MP make_pair 6 #define PB push_back 7 const int INF = 0x3f3f3f3f; 8 const ll INFLL = 0x3f3f3f3f3f3f3f3fLL; 9 inline ll read(){ 10 ll x=0,f=1;char ch=getchar(); 11 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} 12 while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} 13 return x*f; 14 } 15 ////////////////////////////////////////////////////////////////////////// 16 const int maxn = 1e5+10; 17 18 double p[55],dp[55][55]; 19 int n,c; 20 double ans; 21 22 // 做到第t题 在x题之前离开 在第k题用保险,得到sum元的概率是pp【 p[1]*p[2]*p[3]*... 23 void dfs(int t,int x,int k,double sum,double pp){ 24 if(t == x){ 25 dp[x][k] += sum*pp; 26 ans = max(ans,dp[x][k]); 27 return ; 28 }else if(sum>=c && k==t){ 29 dfs(t+1,x,k,(sum-c),pp*(1-p[t])); 30 dfs(t+1,x,k,(sum-c)*2,pp*p[t]); 31 } 32 else 33 dfs(t+1,x,k,sum*2,pp*p[t]); 34 } 35 36 int main(){ 37 freopen("tvshow.in","r",stdin); 38 freopen("tvshow.out","w",stdout); 39 n=read(),c=read(); 40 for(int i=1; i<=n; i++){ 41 cin >> p[i]; 42 p[i] /= 100; 43 } 44 45 for(int i=1; i<=n+1; i++) 46 for(int k=0; k<i; k++) // k=0 可以不用保险 47 dfs(1,i,k,100.0,1.0); 48 49 printf("%.10lf\n",ans); 50 51 return 0; 52 } 53 // http://codeforces.com/gym/100338/attachments
code 2:
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 #define MS(a) memset(a,0,sizeof(a)) 5 #define MP make_pair 6 #define PB push_back 7 const int INF = 0x3f3f3f3f; 8 const ll INFLL = 0x3f3f3f3f3f3f3f3fLL; 9 inline ll read(){ 10 ll x=0,f=1;char ch=getchar(); 11 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} 12 while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} 13 return x*f; 14 } 15 ////////////////////////////////////////////////////////////////////////// 16 const int maxn = 1e5+10; 17 18 int n,c; 19 double p[55]; 20 21 double dfs(int t,double sum,bool have){ 22 if(t >= n){ 23 return sum; 24 } 25 double tmp = max(sum,p[t]*dfs(t+1,sum*2,have)); 26 double money = 0; 27 if(sum>=c && have){ 28 money += p[t] * dfs(t+1,(sum-c)*2,false); 29 money += (1-p[t]) * dfs(t+1,(sum-c),false); 30 } 31 tmp = max(tmp,money); 32 return tmp; 33 } 34 35 int main(){ 36 freopen("tvshow.in","r",stdin); 37 freopen("tvshow.out","w",stdout); 38 cin >> n >> c; 39 for(int i=0; i<n; i++){ 40 cin >> p[i]; 41 p[i] /= 100; 42 } 43 double ans = dfs(0,100.0,true); // true表示还有保险 44 45 printf("%.10lf\n",ans); 46 47 return 0; 48 } 49 // http://codeforces.com/gym/100338/attachments