2016 Multi-University Training Contest 5

 

6/12 

2016 Multi-University Training Contest 5

 

期望+记忆化DP A ATM Mechine(BH)

题意:

  去ATM取钱,已知存款在[0,K]范围内,每一次输入取出钱的金额,如果大于存款,ATM会发出警报,最多W次,问能在W次内取出所有存款的取款次数的期望值。

思路:

  设dp[k][w]表示范围存款在[0,k]内,还有w次报警机会的期望值。状态转移方程:

代码:

#include <bits/stdc++.h>

const int N = 2e3 + 5;
const int INF = 0x3f3f3f3f;
const int D = 16;
double dp[N][D];
bool vis[N][D];

double DP(int k, int w) {
    if (k == 0) return 0;
    if (w == 0) return INF;
    if (vis[k][w]) return dp[k][w];
    double &ret = dp[k][w] = INF;
    for (int i=1; i<=k; ++i) {
        ret = std::min (ret, DP (i-1, w-1)*i/(k+1) + DP (k-i, w)*(k-i+1)/(k+1) + 1);
    }
    vis[k][w] = true;
    return ret;
}

int main() {
    int k, w;
    while (scanf ("%d%d", &k, &w) == 2) {
        printf ("%.6f\n", DP (k, std::min (w, 15)));
    }
    return 0;
}

  

posted @ 2016-08-04 19:39  NEVERSTOPAC  阅读(163)  评论(0编辑  收藏  举报