日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

(算法)宝石升级问题

發布時間:2024/7/19 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (算法)宝石升级问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目:

有一塊寶石,1級升2級成功率100%,2級升3級成功率80%,3級升4級成功率60%,4級升5級成功率40%,每次升級失敗時降回到1級。請問一塊1級寶石升到5級平均要多少次??

思路:

問題:求一塊1級寶石升級到5級的期望次數

1、蒙特卡洛模擬試驗

考慮一下期望的定義,所有的可能的次數*出現該次數的概率之和。出現的次數可能為無窮大,但當次數達到一定數量時,期望就收斂了,因此可以通過概率的模擬試驗來實現。

2、有限狀態機的概率轉移思想

假設dp(i,j)為1級升到5級的平均次數,則有以下遞推式:

dp(1,5) = 1.0 * dp(2,5) + 0.0 * dp(1,5)+1

dp(2,5) = 0.8 * dp(3,5) + 0.2 * dp(1,5)+1

dp(3,5) = 0.6 * dp(4,5)+ 0.4 * dp(1,5)+1

dp(4,5) = 0.4 * dp(5,5) + 0.6 * dp(1,5)+1

其中dp(5,5)=0;

求解上述方程組,得到dp(1,5)即為答案,答案為17.0833.

代碼:

1、蒙特卡洛模擬試驗

#include <iostream> #include <time.h> #include <stdlib.h> #include <iomanip>using namespace std;bool isUpgrade(double p){double prob=rand()/(double)(RAND_MAX);if(prob<=p)return true;elsereturn false; }double ExpectedUpgradeTimes(double *P,int n){const int TIMES=100000000;int grade=0;int times=0;int total=0;double expect=0;for(int i=0;i<TIMES;i++){grade=0;times=0;while(grade!=n-1){if(isUpgrade(P[grade]))grade++;elsegrade=0;times++;}total+=times;}expect=(double)total/TIMES;return expect; }int main(){srand((unsigned int)time(NULL));double P[]={1.0,0.8,0.6,0.4};int len=sizeof(P)/sizeof(P[0]);double exp=ExpectedUpgradeTimes(P,len+1);cout<<fixed<<exp<<endl;cout << setprecision(2) << exp << endl;return 0; }

2、動態規劃

#include <iostream> #include <time.h> #include <stdlib.h> #include <iomanip>using namespace std;double ExpectedUpgradeTimes_DP(double *P,int n){double A[n],B[n];double p[n];p[1] = 1.0;p[2] = 0.8;p[3]=0.6;p[4] =0.4;for(int i=4;i>=1;i--){A[i] = 1+A[i+1]*p[i];B[i] = p[i]*B[i+1]+1-p[i];cout<<A[i]<<" "<<B[i]<<endl;}double t = A[1]/(1-B[1]);return t; }int main(){srand((unsigned int)time(NULL));double P[]={1.0,0.8,0.6,0.4};int len=sizeof(P)/sizeof(P[0]);double exp=ExpectedUpgradeTimes_DP(P,len+1);cout<<fixed<<exp<<endl;cout << setprecision(2) << exp << endl;return 0; }

轉載于:https://www.cnblogs.com/AndyJee/p/4755388.html

總結

以上是生活随笔為你收集整理的(算法)宝石升级问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。