LightOJ-1030 Discovering Gold (概率DP初探)2017寒假集训
题意:有一条长度为n的直线,每次可以丢骰子,丢到几往前走几步并得到这一格的值,不会走出n,求得到值的期望
数据范围:1 <= n <= 100
思路:第一次写概率DP,数学也不怎么好,有点畏难情绪。其实概率DP并没有什么特别的,就是从可能的地方转移过来。
n-1只可能是走到n,最多可能有6种情况,设dp[i]为从i出发的期望,倒过来递推就行
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 5 const int mx = 110; 6 double dp[mx]; 7 8 int main(){ 9 int t, n, kase = 0; 10 scanf("%d", &t); 11 while (t--){ 12 scanf("%d", &n); 13 for (int i = 1; i <= n; i++) 14 scanf("%lf", &dp[i]); 15 for (int i = n-1; i >= 1; i--){ 16 int k = min(6, n-i); 17 double sum = 0; 18 for (int j = i+1; j <= i+k; j++) 19 sum += dp[j]; 20 dp[i] += 1.0*sum/k; 21 } 22 printf("Case %d: %.8f\n", ++kase, dp[1]); 23 } 24 return 0; 25 }