LightOJ - 1030 概率dp
题意:n个格子,每次走1-6步(等概率),走过的格子加上价值,如果走的步数超过n,重选,走到n结束,求价值的期望
题解:概率dp,dp[i]表示第i位走过的概率,只有前6个格子能转移到当前格子,转移到当前格子的概率是1/6(如果后面有6个及以上的格子),否则是1/剩余的格子数,最后用每一位的概率*价值就是期望了
#include<bits/stdc++.h> #define fi first #define se second #define mp make_pair #define pb push_back #define pi acos(-1.0) #define ll long long #define mod 1000000007 #define C 0.5772156649 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 #define pii pair<int,int> using namespace std; const double g=10.0,eps=1e-12; const int N=200+10,maxn=200000+10,inf=0x3f3f3f3f; double dp[N],a[N]; int main() { int res=0,t; scanf("%d",&t); while(t--) { int n; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%lf",&a[i]); dp[i]=0.0; } dp[1]=1; for(int i=2;i<=n;i++) { for(int j=max(1,i-6);j<i;j++) { if(n-j>=6)dp[i]+=dp[j]*1.0/6.0; else if(n-j>=1)dp[i]+=dp[j]*1.0/(n-j); } } /* for(int i=1;i<=n;i++) printf("%.10f\n",dp[i]);*/ double ans=0; for(int i=1;i<=n;i++) ans+=dp[i]*a[i]; printf("Case %d: %.10f\n",++res,ans); } return 0; } /******************** ********************/