zoukankan      html  css  js  c++  java
  • Light oj 1030 概率DP

    D - Discovering Gold

    Crawling in process... Crawling failed Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu

    Description

    You are in a cave, a long cave! The cave can be represented by a 1 x N grid. Each cell of the cave can contain any amount of gold.

    Initially you are in position 1. Now each turn you throw a perfect 6 sided dice. If you get X in the dice after throwing, you add X to your position and collect all the gold from the new position. If your new position is outside the cave, then you keep throwing again until you get a suitable result. When you reach the Nth position you stop your journey. Now you are given the information about the cave, you have to find out the expected number of gold you can collect using the given procedure.

    Input

    Input starts with an integer T (≤ 100), denoting the number of test cases.

    Each case contains a blank line and an integer N (1 ≤ N ≤ 100) denoting the dimension of the cave. The next line contains N space separated integers. The ith integer of this line denotes the amount of gold you will get if you come to the ith cell. You may safely assume that all the given integers will be non-negative and no integer will be greater than 1000.

    Output

    For each case, print the case number and the expected number of gold you will collect. Errors less than 10-6 will be ignored.

    Sample Input

    3

    1

    101

    2

    10 3

    3

    3 6 9

    Sample Output

    Case 1: 101.0000000000

    Case 2: 13.000

    Case 3: 15

    题目大意:抛色子移动,每个地点都有一些金子,问你到到达终点的时候拿到的金子数量的数学期望。

    思路分析:刚开始始终都不懂题意,后来百度了一下才知道是让去求期望,但是依然没有什么好的思路,

    后来认真的去复习了一些有关数学期望的姿势,知道读到这一句,解决这类问题,对随机变量A、B,有

    数学期望E(aA+bB)=aE(A)+bE(b);根据这个不正可以构建状态转移方程用DP做么,每一点的期望可以

    由它之前的位置的点的期望求出,DP[i]=a[i]+1/step*dp[i-(1...step)]

    但是我现在不太理解的是为什么一定要逆推而不能正推orz,求指教,想明白了以后我也会回来补上。

    代码:

    #include <iostream>
    #include <algorithm>
    #include <stack>
    #include <queue>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    const int maxn=110;
    double dp[maxn],a[maxn];
    int kase=0;
    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--)
        {
            int n;
            scanf("%d",&n);
            for(int i=1;i<=n;i++)
                scanf("%lf",&a[i]);
            memset(dp,0,sizeof(dp));
            dp[n]=a[n];
            for(int i=n-1;i>=1;i--)
            {
                dp[i]=a[i];
                //cout<<dp[i]<<endl;
                int step=min(6,n-i);
                for(int j=1;j<=step;j++)
                {
                    dp[i]+=1.0/(step*1.0)*dp[i+j];
                }
            }
            printf("Case %d: %.6lf ",++kase,dp[1]);
        }
        return 0;
    }

  • 相关阅读:
    Algs4-1.3链表实现泛型可迭代Stack
    Algs4-1.3链表实现科泛型可迭代Bag
    Algs4-1.3链表实现不定容泛型Queue不支持迭代
    Algs4-1.3不定容数组实现泛型栈支持迭代
    Algs4-1.3链表实现不定容泛型Stack不支持迭代
    Algs4-1.3不定容泛型栈(不可迭代)
    Algs4-1.3定容字符串栈
    Algs4-1.3定容泛型栈
    Algs4-1.3E.W.Dijkstra双栈算术表达式求值算法
    Algs4-1.2(非习题)可视化累加器
  • 原文地址:https://www.cnblogs.com/xuejianye/p/5462054.html
Copyright © 2011-2022 走看看