HDU 5781 ATM Mechine (概率DP)
ATM Mechine
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=5781
Description
Alice is going to take all her savings out of the ATM(Automatic Teller Machine). Alice forget how many deposit she has, and this strange ATM doesn't support query deposit. The only information Alice knows about her deposit is the upper bound is K RMB(that means Alice's deposit x is a random integer between 0 and K (inclusively)).
Every time Alice can try to take some money y out of the ATM. if her deposit is not small than y, ATM will give Alice y RMB immediately. But if her deposit is small than y, Alice will receive a warning from the ATM.
If Alice has been warning more then W times, she will be taken away by the police as a thief.
Alice hopes to operate as few times as possible.
As Alice is clever enough, she always take the best strategy.
Please calculate the expectation times that Alice takes all her savings out of the ATM and goes home, and not be taken away by the police.
##Input
The input contains multiple test cases.
Each test case contains two numbers K and W.
1≤K,W≤2000
##Output
For each test case output the answer, rounded to 6 decimal places.
##Sample Input
1 1
4 2
20 3
##Sample Output
1.000000
2.400000
4.523810
##Source
2016 Multi-University Training Contest 5
##题意:
Alice在ATM取钱,他不知道确切数字而只知道一个上限K,现在他要通过一系列尝试来取出所有钱,每次尝试取y,如果有y则取出,不足y则会被警告,警告超过W次会GG.
Alice会尽量用少的次数去尝试,求尝试次数的期望.
##题解:
概率DP.
dp[i][j]:存款上限为i,还能被警告不超过j次时的次数期望.
由于每次取的数是等概率的:每次取k∈[0,i],其中[0,k-1]这k个数会导致这次取钱被警告.
所以不被警告的期望是 (i+1-k)/(i+1) * dp[i-k][j];
被警告的期望是 k/(i+1) * dp[k-1][j-1]; (由于取k失败,那么剩余上限为k-1)
转移方程:
关键点:由于Alice会用尽量少的次数去尝试,那么他尝试的次数不会超过二分的次数:
所以j的范围是min(15,W), 这样才能使得dp不超时.
采用记忆化搜索的形式来求DP值.
对于所有数据DP数组的值是共用的,所以只用初始化一次.(否则会TLE).
1007(HDU5787)的DP也是如此,切记.
##代码:
``` cpp
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define LL long long
#define mid(a,b) ((a+b)>>1)
#define eps 1e-8
#define maxn 2100
#define mod 1000000007
#define inf 0x3f3f3f3f
#define IN freopen("in.txt","r",stdin);
using namespace std;
double dp[maxn][maxn];
double get_dp(int i, int j) {
if(i == 0) return dp[i][j] = 0;
if(j == 0) return dp[i][j] = inf;
if(dp[i][j] != -1.0) return dp[i][j];
double ans = inf;
for(int k=1; k<=i; k++) {
ans = min(ans, (i+1-k)/(i+1.0)get_dp(i-k,j) + k/(i+1.0)get_dp(k-1,j-1) + 1);
}
return dp[i][j] = ans;
}
int main(int argc, char const *argv[])
{
//IN;
int k,w;
for(int i=0; i<maxn; i++)
for(int j=0; j<maxn; j++)
dp[i][j] = -1.0;
while(scanf("%d %d", &k,&w) != EOF)
{
printf("%.6f\n", get_dp(k,min(w,15)));
}
return 0;
}
</big>
HDU 5781 ATM Mechine (概率DP)的更多相关文章
- HDU 5781 ATM Mechine 期望dp
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5781 ATM Mechine Time Limit: 6000/3000 MS (Java/Othe ...
- hdu 5781 ATM Mechine dp
ATM Mechine 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5781 Description Alice is going to take ...
- HDU 5781 ATM Mechine
题目大意:某个未知整数x等概率的分布在[0,k]中.每次你都可以从这个整数中减去一个任意整数y,如果x>=y,那么x=x-y,操作次数累计加1:否则,将会受到一次错误提示.当错误提示超过w次,将 ...
- ATM Mechine (概率DP)
题意:去银行取最多K钱,想要全部取完,但是有个限制就是如果你输入取钱的额度超过了你已有的钱,那么会接受一次警告并无法取钱,然后求最多不超过w次警告的前提下你取完所有钱所需要的最少次数. 思路:概率DP ...
- 【动态规划】HDU 5781 ATM Mechine
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5781 题目大意: 一个人有[0,K]内随机的钱,每次可以随意取,但是不知道什么时候取完,取钱超过剩余 ...
- HDU 4089 Activation(概率DP)(转)
11年北京现场赛的题目.概率DP. 公式化简起来比较困难....而且就算结果做出来了,没有考虑特殊情况照样会WA到死的.... 去参加区域赛一定要考虑到各种情况. 像概率dp,公式推出来就很容易写 ...
- HDU 4405 Aeroplane chess (概率DP)
题意:你从0开始,要跳到 n 这个位置,如果当前位置是一个飞行点,那么可以跳过去,要不然就只能掷骰子,问你要掷的次数数学期望,到达或者超过n. 析:概率DP,dp[i] 表示从 i 这个位置到达 n ...
- HDU - 5001 Walk(概率dp+记忆化搜索)
Walk I used to think I could be anything, but now I know that I couldn't do anything. So I started t ...
- HDU 2955 Robberies 背包概率DP
A - Robberies Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submi ...
随机推荐
- hdu 4939 Stupid Tower Defense ( dp )
题目链接 题意:给出一条长为n个单位长度的直线,每通过一个单位长度需要t秒. 有3种塔,红塔可以在当前格子每秒造成x点伤害,绿塔可以在之后的格子每秒造成y点伤害, 蓝塔可以使通过单位长度的时间增加z秒 ...
- volicity语法学习和总结
Velocity是一个基于java的模板引擎(template engine).它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象.当Velocit ...
- bzoj2437
会做jsoi那道game,这题就非常简单了吧 我们考虑空格的移动,显然,初始与空格位置距离为奇数的黑棋和距离为偶数的白棋并没有什么用, 空格不会移到那,我们直接把他们当作障碍,其他点我们当作可移动区域 ...
- Web Api 中使用 PCM TO WAV 的语音操作
/// <summary> /// 语音[文件.上传.解码.保存(WAV)] /// </summary> [DeveloperEx("Liwei:秘书语音需求单&q ...
- C# winform 窗体从右下角向上弹出窗口效果
参考自 http://blog.csdn.net/yilan8002/article/details/7197981 /// <summary> /// 窗体动画函数 注意:要引用Syst ...
- HDU 5305 Friends (DFS,穷举+剪枝)
题意: 给定n个人,m对朋友关系,如果对于每个人,只能刚好选择其所有朋友中的一半的人进行聊天(只是我和我的朋友,不是我的朋友和我的朋友),那么有多少种情况?只要一个选择不同,视为不同情况. 思路: 比 ...
- poj 2063 Investment
题意:给定一个初始资金capital,然后给定d种投资方案,每种投资方案中有投资额value[i](是1000的倍数)和利息interest[i],每年的投资就可以拿到全部利息,然后累加起来继续投资利 ...
- 【JSP】三种弹出对话框的用法实例
对话框有三种 1:只是提醒,不能对脚本产生任何改变: 2:一般用于确认,返回 true 或者 false ,所以可以轻松用于 if...else...判断 3: 一个带输入的对话框,可以返回用户填入的 ...
- 面试题 IQ
现在有一大块金条,它可以分为七小块金条.是这样子的,工人为你工作7天,每天都将获得一小块金条,你要做的就是发工资,切割大块金条的次数最多两次,你有什么方法让工人每天都获得一小块金条呢?
- IIS部署网站