HDU 5781 ATM Mechine( 多校5 DP&期望+记忆化搜索)

来源:互联网 发布:h5页面分享到朋友圈js 编辑:程序博客网 时间:2024/05/19 11:48

题意:Alice忘记了自己银行里存了多少钱,只记得在[0,k]之间。每次取钱如果余额足够就出钱,否则警告一次,警告超过w次就会把你抓起来,在不想被警察抓起来的前提下,Alice采取最优策略,求期望取钱多少次能知道自己存了多少钱。

官方题解:


思路分析:上面等式中左边的一部分是取的数k不超过真实余额的概率,右面部分是取的存款k超过真实余额的概率。后面的+1代表本次操作,所以期望应该+1。

题目连接:


AC代码:

#include <iostream>#include <stdio.h>#include <cstring>#include <algorithm>#include <queue>#include <map>#include <cmath>using namespace std;typedef long long ll;typedef long long LL;const ll mod=1e9+7;const int maxn=2000+5;double dp[maxn][20];///dp[i][j]表示当前余额范围为0~i,剩余警告次数为jbool visit[maxn][20];///记忆化搜索double dfs(int k,int w){    if(k==0)    return 0.000000;///结束递归的条件    if(w==0)    return 1e12;    if(visit[k][w]) return dp[k][w];///记忆化搜索    double tmp=1e12;    for(int i=1;i<=k;i++)///从一开始枚举,找到最小的期望值    {        tmp=min(tmp,(k+1-i)*dfs(k-i,w)/(k+1)+i*dfs(i-1,w-1)/(k+1)+1);    }    visit[k][w]=1;    return dp[k][w]=tmp;}int main(){    int k,w;    while(~scanf("%d%d",&k,&w))    {        printf("%.6lf\n",dfs(k,min(12,w)));    }    return 0;}


0 0
原创粉丝点击