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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值