P - Discovering Gold LightOJ - 1030
https://vjudge.net/contest/349029#problem/P
题目描述:
长为n的山洞,从0出发,每次掷一个6面的色子,得到的点数x。假设当前位置i,如果i+x<=n,就移动到i+x。否则再掷一次。直到走到第n个点。
每个点都有一定的金币。问他这一趟能得到金币的期望。
分析:
dp[i]表示第i个位置的期望。从i点可以转移到i+k点。k对应的每个整数,概率都是相同的,即u=1/min(n-i,6) 。所以从后往前推,就有dp[i]+=dp[i+k] * u。
代码:
#include <cstdio> #include <algorithm> #include <iostream> #include <cstring> #include <vector> #include <cmath> using namespace std; typedef long long ll; const int mod=1e9+7; const int maxn=106; int main() { int T; scanf("%d",&T); for(int k=1;k<=T;k++) { int n; scanf("%d",&n); int a[n+6]; double dp[n+6]; memset(dp,0,sizeof dp); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); dp[i]=a[i]; } for(int i=n-1;i>=1;i--) { int p=n-i>6?6:n-i; for(int j=1;j<=p;j++) { dp[i]+=dp[i+j]*1.0/p; } } printf("Case %d: %.6f\n",k,dp[1]); } return 0; }