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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

java跳格子不同跳发_(算法)跳格子

發布時間:2023/12/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java跳格子不同跳发_(算法)跳格子 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目:

有1,2,3,......無窮個格子,你從1號格子出發,每次1/2概率向前跳一格,1/2概率向前跳兩格,走到格子編號為4的倍數時結束,結束時期望走的步數為____。

思路:

1、MonteCarlo模擬實驗

參考代碼

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

跳一格跳兩格都算一步;

dp(i,j)表示從格子i到格子j的期望步數:

dp(1,4)=1+0.5*dp(2,4)+0.5*dp(3,4);

dp(2,4)=1+0.5*dp(3,4)+0.5*dp(4,4);

dp(3,4)=1+0.5*dp(4,4)+0.5*dp(1,4);

dp(4,4)=0;

求解上述方程得到dp(1,4)=18/5;

代碼:

#include

#include

#include

#include

using namespace std;

bool rndJump(double p){

double prob=rand()/(double)RAND_MAX;

if(prob<=p)

return true;

else

return false;

}

// MonteCarlo Simulation

double ExpectedSteps(){

const int MAX_TRY=100000000;

double expected=0;

int total=0;

int times=0;

int steps=0;

for(int i=0;i

times=0;

steps=1;

while(steps%4!=0){

if(rndJump(0.5))

steps+=1;

else

steps+=2;

times++;

}

total+=times;

}

expected=(double)total/MAX_TRY;

return expected;

}

// DynamicProgramming-like

// f(1,4)=1+0.5*f(2,4)+0.5*f(3,4);

// f(2,4)=1+0.5*f(3,4)+0.5*f(4,4);

// f(3,4)=1+0.5*f(4,4)+0.5*f(1,4);

// f(4,4)=0;

double ExpectedSteps_DP(int n){

double A[n],B[n];

memset(A,0,n*sizeof(double));

memset(B,0,n*sizeof(double));

A[3]=0;

B[3]=0;

A[2]=1+0.5*A[3];

B[2]=0.5;

A[1]=1+0.5*A[2]+0.5*A[3];

B[1]=0.5*B[2]+0.5*B[3];

A[0]=1+0.5*A[1]+0.5*A[2];

B[0]=0.5*B[1]+0.5*B[2];

return (double)A[0]/(1-B[0]);

}

int main(){

cout<< ExpectedSteps()<

cout<< ExpectedSteps_DP(4)<

return 0;

}

總結

以上是生活随笔為你收集整理的java跳格子不同跳发_(算法)跳格子的全部內容,希望文章能夠幫你解決所遇到的問題。

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