zoukankan      html  css  js  c++  java
  • LightOJ1030 Discovering Gold(概率DP)

    题目大概说一个1×n的格子,每个格子都有一定的黄金,起点在1,终点在n,通过投掷6面骰子前进与骰子点数一样的步数,如果会超过n就重新投,每到一个格子就获得其中的黄金。问到达n能得到的黄金数目的期望。

    求概率是正推,求期望是逆推。。容我慢慢体会。。

    期望:

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 using namespace std;
     5 double d[111];
     6 int main(){
     7     int t,n,a[111];
     8     scanf("%d",&t);
     9     for(int cse=1; cse<=t; ++cse){
    10         scanf("%d",&n);
    11         for(int i=1; i<=n; ++i){
    12             scanf("%d",a+i);
    13         }
    14         memset(d,0,sizeof(d));
    15         d[n]=a[n];
    16         for(int i=n-1; i>=1; --i){
    17             int k=min(6,n-i);
    18             for(int j=1; j<=k; ++j){
    19                 d[i]+=(d[i+j]+a[i])/k;
    20             }
    21         }
    22         printf("Case %d: %f
    ",cse,d[1]);
    23     }
    24     return 0;
    25 }
    View Code

    也可以先求到每个格子的概率,然后概率×黄金数就是期望:

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 using namespace std;
     5 double d[111];
     6 int main(){
     7     int t,n,a[111];
     8     scanf("%d",&t);
     9     for(int cse=1; cse<=t; ++cse){
    10         scanf("%d",&n);
    11         for(int i=1; i<=n; ++i){
    12             scanf("%d",a+i);
    13         }
    14         memset(d,0,sizeof(d));
    15         d[1]=1;
    16         for(int i=1; i<n; ++i){
    17             int k=min(6,n-i);
    18             for(int j=1; j<=k; ++j){
    19                 d[i+j]+=d[i]/k;
    20             }
    21         }
    22         double res=0;
    23         for(int i=1; i<=n; ++i) res+=d[i]*a[i];
    24         printf("Case %d: %f
    ",cse,res);
    25     }
    26     return 0;
    27 }
    View Code
  • 相关阅读:
    2016第17周四
    2016第17周三
    2016第17周二
    OSGI框架学习
    2016年第16周日
    2016第16周六
    如何培养技术洞见力
    2016第15周四
    深入浅出ClassLoader
    Linux智能小开关rfkill
  • 原文地址:https://www.cnblogs.com/WABoss/p/5296629.html
Copyright © 2011-2022 走看看