hdu 4050 2011北京赛区网络赛K 概率dp ***
题目:给出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 }