码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 4050 2011北京赛区网络赛K 概率dp ***

时间:2015-08-08 17:58:29      阅读:268      评论:0      收藏:0      [点我收藏+]

标签:

题目:给出1-n连续的方格,从0开始,每一个格子有4个状态,左右脚交替,向右跳,而且每一步的步长必须在给定的区间之内。当跳出n个格子或者没有格子可以跳的时候就结束了,求出游戏的期望步数

0:表示不能到达这个格子

1:表示左脚跳进这个格子

2:表示右脚跳进这个格子

3:随意哪个脚跳进这个格子,而且下一步随意用哪个脚

 

dp[i][j] :表示走到第 i 个格子在 j 状态的期望。

 

当j=1时,你可以走到dp[i+k][2],dp[i+k][3],

 

当j=2时,你可以走到dp[i+k][1],dp[i+k][3],

当j=3时,你可以走到dp[i+k][2],dp[i+k][3],dp[i+k][1],

概率dp专题一波走起

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<queue>
 7 #include<map>
 8 using namespace std;
 9 #define MOD 1000000007
10 const int INF=0x3f3f3f3f;
11 const double eps=1e-5;
12 typedef long long ll;
13 #define cl(a) memset(a,0,sizeof(a))
14 #define ts printf("*****\n");
15 const int MAXN=1005;
16 double dp[4004][4];
17 double p[4004][4];
18 int main(){
19     int t,a,b,n;
20     scanf("%d",&t);
21     while(t--)
22     {
23         scanf("%d%d%d",&n,&a,&b);
24         for(int i=1;i<=n;i++)
25             for(int j=0;j<4;j++)
26                 scanf("%lf",&p[i][j]);
27         for(int i=n+1;i<=n+a;i++)
28             for(int j=0;j<4;j++)
29                 p[i][j]=(j==3);
30         memset(dp,0,sizeof(dp));
31         dp[0][3]=1;
32         for(int i=0;i<=n;i++){
33             double p1=1,p2=1,p3=1;
34             for(int j=a;j<=b;j++){
35                 dp[i+j][2]+=dp[i][1]*p1*p[i+j][2];
36                 dp[i+j][3]+=dp[i][1]*p1*p[i+j][3];
37                 p1*=(p[i+j][0]+p[i+j][1]);
38                 dp[i+j][1]+=dp[i][2]*p2*p[i+j][1];
39                 dp[i+j][3]+=dp[i][2]*p2*p[i+j][3];
40                 p2*=(p[i+j][0]+p[i+j][2]);
41                 dp[i+j][1]+=dp[i][3]*p3*p[i+j][1];
42                 dp[i+j][2]+=dp[i][3]*p3*p[i+j][2];
43                 dp[i+j][3]+=dp[i][3]*p3*p[i+j][3];
44                 p3*=p[i+j][0];
45             //    cout<<dp[i+j][1]<<" "<<dp[i+j][2]<<" "<<dp[i+j][3]<<endl;
46             }
47         }
48         double ans=0;
49         for(int i=1;i<=n+a;i++)
50             for(int j=1;j<4;j++)
51                 ans+=dp[i][j];
52         printf("%.8f\n",ans);
53     }
54     return 0;
55 }

 

hdu 4050 2011北京赛区网络赛K 概率dp ***

标签:

原文地址:http://www.cnblogs.com/cnblogs321114287/p/4713508.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!