程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU 4405 Aeroplane chess(概率DP)

HDU 4405 Aeroplane chess(概率DP)

編輯:C++入門知識

HDU 4405 Aeroplane chess(概率DP)


題意:有一條長n的軸, 標有0~n, 從0開始擲色子, 骰子有1~6, 擲到幾就向右走幾步, 還有一些航線, 可以直接從一個點到另一個點。 求最終走到n的期望。

思路:很顯然的概率DP。 但是要求期望, 我們首先要知道一個公式:dp[i]=sum(dp[j])+1(i+1<=j<=i+6), dp[i]表示從i點投擲,最終到n的期望, 根據期望的線性性質, 我們就可以這樣求期望了, +1 是表示的下一步的期望

細節參見代碼:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std;
typedef long long ll;
typedef long double ld;
const ld eps = 1e-9, PI = 3.1415926535897932384626433832795;
const int mod = 1000000000 + 7;
const int INF = 0x3f3f3f3f;
// & 0x7FFFFFFF
const int seed = 131;
const ll INF64 = ll(1e18);
const int maxn = 100000 + 10;
int T,n,m,vis[maxn],x,y;
double d[maxn];
void init() {
    memset(d, 0, sizeof(d));
    memset(vis, -1, sizeof(vis));
}
int main() {
    while(~scanf("%d%d",&n,&m) && (n || m)) {
        init();
        for(int i=0;i=0;i--) {
            if(vis[i] != -1) d[i] = d[vis[i]];
            else {
                for(int j=1;j<=6;j++) d[i] += d[i+j];
                d[i] = d[i] / 6.0 + 1;
            }
        }
        printf("%.4f\n",d[0]);
    }
    return 0;
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved