HDU 4405 Aeroplane chess
本题乃水题是也。dp(i)表示当前在第i格时,到达终点需要掷骰子次数的期望。dp(i)=1/6(dp(i + 1) + dp(i + 2) + dp(i + 3) + dp(i + 4)+ dp(i + 5) + dp(i + 6))+1。如果i可以直接跳到某点j,则dp(i)=dp(j)。
View Code
1 #include <iostream> 2 #include <cstdio> 3 #define maxn 100010 4 using namespace std; 5 6 int next[maxn]; 7 double d[maxn]; 8 int n,m; 9 10 double dp(int i) 11 { 12 double &ans = d[i]; 13 if(ans != -1) 14 return ans; 15 if(i >= n) 16 return 0; 17 int temp = next[i]; 18 while(temp) 19 { 20 if(next[temp]) 21 temp = next[temp]; 22 else 23 break; 24 } 25 if(temp) ans = dp(temp); 26 else 27 { 28 ans = (dp(i + 1) + dp(i + 2) + dp(i + 3) + dp(i + 4) 29 + dp(i + 5) + dp(i + 6)) / 6 + 1; 30 } 31 return ans; 32 } 33 34 int main() 35 { 36 while(scanf("%d%d",&n,&m),n + m) 37 { 38 int i,a,b; 39 for(i = 0;i < maxn;i++) 40 { 41 d[i] = -1; 42 next[i] = 0; 43 } 44 for(i = 1;i <= m;i++) 45 { 46 scanf("%d%d",&a,&b); 47 next[a] = b; 48 } 49 printf("%.4f\n",dp(0)); 50 } 51 return 0; 52 }