hdu 3853 LOOPS
DP[i][j]表示到R,C的步数期望,倒着DP,如果状态设为从1,1到i,j的期望,难搞;DP列方程有两种方法:
1.dp[i][j]=p[i][j][1]*(dp[i][j+1]+2)+p[i][j][2]*(dp[i+1][j]+2)+p[i][j][0]*(dp[i][j]+2).化解后后便可以倒着DP.
2.dp[i][j]暴力枚举往下的情况 p*(dpnext+2)+p*(dpnext+4)*s+p*(dpnext+6)*s*s....... 列项相消出结果 也能AC. 两个式子应该能化成一样 .
View Code
1 /*
2 无限枚举推出来的公式:
3 if(i==r&&j==c) continue;
4 dp[i][j]=0;
5 if(fabs(p[i][j][0]-1.0)<eps) continue;
6 double ss=1.0-p[i][j][0];
7 dp[i][j]+=(p[i][j][1]+p[i][j][2])*2/(ss*ss);
8 if(i<r)
9 dp[i][j]+=p[i][j][2]*(dp[i+1][j])/ss;
10 if(j<c)
11 dp[i][j]+=p[i][j][1]*(dp[i][j+1])/ss;
12 */
13 //下面是第一个式子写的程序
14 double gao()
15 {
16 dp[r][c]=0;
17 for(int i=r;i>=1;i--)
18 for(int j=c;j>=1;j--)
19 {
20 if(i==r&&j==c) continue;
21 dp[i][j]=0;
22 if(fabs(p[i][j][0]-1.0)<eps) continue;
23 double ss=1.0-p[i][j][0];
24 dp[i][j]+=p[i][j][0]*2.0/ss;
25 if(i<r)
26 dp[i][j]+=p[i][j][2]*(dp[i+1][j]+2)/ss;
27 if(j<c)
28 dp[i][j]+=p[i][j][1]*(dp[i][j+1]+2)/ss;
29 }
30 return dp[1][1];
31 }
posted on 2011-10-14 23:52 yaoz10051538 阅读(207) 评论(0) 编辑 收藏 举报