Codeforces 167B Wizards and Huge Prize(概率dp)
生活随笔
收集整理的這篇文章主要介紹了
Codeforces 167B Wizards and Huge Prize(概率dp)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題意:
n個人,開始有一個容量為k得背包,擊敗一個人背包可以獲得一定容量或得到一個財富(放入背包內(nèi)),給出擊敗每個人的概率,求至少擊敗l個人,且背包容量大于獲得的總財富值的概率
分析:
狀態(tài)好確定,dp[i][j][k]表示前i個人擊敗j個背包容量是k是的概率,求概率正推,要注意這時背包容量能為負(fù),我們把容量都加上B。
#include <map> #include <set> #include <list> #include <cmath> #include <queue> #include <stack> #include <cstdio> #include <vector> #include <string> #include <cctype> #include <complex> #include <cassert> #include <utility> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> using namespace std; typedef pair<int,int> PII; typedef long long ll; #define lson l,m,rt<<1 #define pi acos(-1.0) #define rson m+1,r,rt<<11 #define All 1,N,1 #define read freopen("in.txt", "r", stdin) #define B 201 const ll INFll = 0x3f3f3f3f3f3f3f3fLL; const int INF= 0x7ffffff; const int mod = 1000000007; double dp[210][210][2*B+10]; int a[210],p[210]; int n,l,k; void solve(){memset(dp,0,sizeof(dp));dp[0][0][B+k]=1;for(int i=1;i<=n;++i)for(int j=0;j<=i;++j)for(int k=0;k<=2*B;++k){dp[i][j][k]+=dp[i-1][j][k]*(1-p[i]/100.0);//未擊敗第i個人if(a[i]==-1){if(k>0)//必須能放下一個財富dp[i][j+1][k-1]+=dp[i-1][j][k]*(p[i]/100.0);}else{if(k+a[i]>2*B)dp[i][j+1][2*B]+=dp[i-1][j][k]*(p[i]/100.0);elsedp[i][j+1][k+a[i]]+=dp[i-1][j][k]*(p[i]/100.0);}}//符合條件的情況的概率和double total=0.0;for(int j=l;j<=n;++j)for(int k=B;k<=2*B;++k)total+=dp[n][j][k];printf("%.12lf\n",total); } int main() {while(~scanf("%d%d%d",&n,&l,&k)){for(int i=1;i<=n;++i)scanf("%d",&p[i]);for(int i=1;i<=n;++i)scanf("%d",&a[i]);solve();} return 0; }
?
轉(zhuǎn)載于:https://www.cnblogs.com/zsf123/p/4777102.html
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的Codeforces 167B Wizards and Huge Prize(概率dp)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: POJ 1741 Tree(树分治)
- 下一篇: [iOS]关于零基础学习iOS开发的学习