UVA 10529 - Dumb Bones(概率+区间dp)
UVA 10529 - Dumb Bones
option=com_onlinejudge&Itemid=8&category=518&page=show_problem&problem=1470" style="">题目链接
题意:你试图把一些多米诺骨牌排成直线,然后推倒它们。可是如果你在放骨牌的时候不小心把刚放的骨牌碰倒了,它就会把相临的一串骨牌全都碰倒。而你的工作也被部分的破坏了。 比方你已经把骨牌摆成了DD__DxDDD_D的形状,而想要在x这个位置再放一块骨牌。
它可能会把左边的一块骨牌或右边的三块骨牌碰倒。而你将不得不又一次摆放这些骨牌。 这样的失误是无法避免的。可是你能够应用一种特殊的放骨牌方法来使骨牌很多其它的向一个方向倒下。 给出你要摆放的骨牌数目,以及放骨牌时它向左和向右倒的概率。计算你为完毕任务摆放的骨牌数目的平均数。如果你使用了最佳的摆放策略。
输入将包括至多100个測试点,每一个測试点占一行,包括须要摆放的骨牌数目n (1≤n≤1000)。以及两个非负实数Pl, Pr。表示骨牌向左和向右倒的概率。保证1<Pl+Pr≤0.5。 最后一个測试点包括一个数0。对于每一个測试点输出题目要求的数目。保留两位小数。
思路:概率,+区间dp,dp[i]表示有i个连续的多米诺骨牌,那么每次要组成i,就能够选中间随意一个位置,把这个骨牌分成两部分。dp[l]和dp[r]然后考虑在放一个。假设碰到左边,就要又一次放左边,右边同理,依据期望公式,平均1 / (1 - pl - pr)步能成功放一个,也就是说之前都会有碰倒,那么碰倒的话须要走的步数期望为(1 + dp[l]pl + dp[r]
pr),所以期望为(1 + dp[l] pl + dp[r] pr) / (1 - pl - pr) + dp[l] + dp[r],状态转移方程为
dp[i] = min(计算概率(dp[l], dp[r])) {枚举中间位置求出l, r}
于是这题递推求解就能过了。只是复杂度是O(n^2),事实上还有能够优化的地方
能够依据动态规划时候,dp[i]这个数组在找寻最小值的时候。事实上方程是满足一个下凹函数的,所以这步实际上能够利用三分求解,复杂度为O(nlog(n)),然后实际上。对于下凹函数。那么事实上对于下次找最小值的位置,是不会减小的。因此假设每次维护记录下上次找到答案的位置。这样均摊下来,时间复杂度就能优化到O(n)
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; #define INF 0x3f3f3f3f
const int N = 1000005;
int n;
double p, pl, pr, dp[N]; double cal(int l, int r) {
return dp[l] + dp[r] + (pl * dp[l] + pr * dp[r] + 1) / p;
} double solve() {
p = 1 - pl - pr;
dp[0] = 0; dp[1] = 1 / p;
int pre = 0;
for (int i = 2; i <= n; i++) {
dp[i] = cal(pre, i - pre - 1);
for (int j = pre + 1; j < i; j++) {
int l = j, r = i - 1 - j;
double tmp = cal(l, r);
if (dp[i] >= tmp) {
dp[i] = tmp;
pre = j;
}
else break;
}
}
return dp[n];
} int main() {
while (~scanf("%d", &n) && n) {
scanf("%lf%lf", &pl, &pr);
printf("%.2lf\n", solve());
}
return 0;
}
UVA 10529 - Dumb Bones(概率+区间dp)的更多相关文章
- UVA 10529 - Dumb Bones (概率dp)
题目描述 You are trying to set up a straight line of dominos, standing on end, to be pushed over later f ...
- UVA 10529 Dumb Bones 可能性dp 需求预期
主题链接:点击打开链接 题意: 要在一条直线上摆多米诺骨牌. 输入n, l, r 要摆n张排,每次摆下去向左倒的概率是l, 向右倒的概率是r 能够採取最优策略.即能够中间放一段.然后左右两边放一段等, ...
- [UVA 10529]Dumb Bones
题面在这里 题意 放\(n\)个相连的骨牌,每次放的时候有\(pl\)的概率往左倒,有\(pr\)的概率往右倒,骨牌倒的时候可能会打翻左边相邻或者右边相邻的骨牌,并引起连锁反应直到最后一个骨牌旁边没有 ...
- #11 UVA 10529 Dumb Bones
题意: 放一堆排,每放一张,有pa的概率让左边的全倒,有pb的概率让右边全倒 问在最优策略下,最少要放几张才能摆放出n张 1<=n<=1000 题解: 这题应该还是很经典的 首先是期望部分 ...
- uva 10003 Cutting Sticks 【区间dp】
题目:uva 10003 Cutting Sticks 题意:给出一根长度 l 的木棍,要截断从某些点,然后截断的花费是当前木棍的长度,求总的最小花费? 分析:典型的区间dp,事实上和石子归并是一样的 ...
- UVA - 10891 Game of Sum 区间DP
题目连接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19461 Game of sum Description This ...
- URAL 1776 Anniversary Firework (概率,区间DP)
坑,一开始以为,分成两半的时候去最大那个就行了, 实际上这样是不对的,因为有可能出现小的一半的时间比大的要长, 因为还和等待次数有关,且转移的时候需要用到次数更小的状态, 所以状态定义为二维,dp[i ...
- uva live 4394 String painter 区间dp
// uva live 4394 String painter // // 这一题是训练指南上dp专题的习题,初看之下认为仅仅是稍微复杂了一点 // 就敲阿敲阿敲,两个半小时后,发现例子过了.然而自己 ...
- uva 10891 Game of Sum(区间dp)
题目连接:10891 - Game of Sum 题目大意:有n个数字排成一条直线,然后有两个小伙伴来玩游戏, 每个小伙伴每次可以从两端(左或右)中的任意一端取走一个或若干个数(获得价值为取走数之和) ...
随机推荐
- C++ 构造函数 析构函数 虚函数
C++:构造函数和析构函数能否为虚函数? 简单回答是:构造函数不能为虚函数,而析构函数可以且常常是虚函数. (1) 构造函数不能为虚函数 让我们来看看大牛C++之父 Bjarne Stroustrup ...
- py2exe使用方法 (含一些调试技巧,如压缩email 类)
http://justcoding.iteye.com/blog/900993 一.简介 py2exe是一个将python脚本转换成windows上的可独立执行的可执行程序(*.exe)的工具,这样, ...
- IOS 改变Navigation的返回按钮
两个办法: 1, 手动为每一个UIViewController添加navigationItem的leftButton的设置代码 2,为UINavigationController实现delegate, ...
- hdu 4503(数学,概率)
湫湫系列故事——植树节 Time Limit: 1000/500 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total ...
- [Inside HotSpot] Java分代堆
[Inside HotSpot] Java分代堆 1. 宇宙初始化 JVM在启动的时候会初始化各种结构,比如模板解释器,类加载器,当然也包括这篇文章的主题,Java堆.在hotspot源码结构中gc/ ...
- 洛谷——P2983 [USACO10FEB]购买巧克力Chocolate Buying
P2983 [USACO10FEB]购买巧克力Chocolate Buying 题目描述 Bessie and the herd love chocolate so Farmer John is bu ...
- 会话跟踪技术Cookieless
会话跟踪技术Cookieless 在Web应用中,通常使用Cookie记录用户的状态,如用户名.访问时间等信息.当进行HTTP请求的时候,会自动发送Cookie信息给服务器.服务器接收到,就可以判 ...
- Anaconda环境搭建
最近要使用Anaconda做一些机器视觉相关的开发,在此记录下Anaconda的搭建 首先去官网下载 这里我选择windows平台 由于浏览器自己下载的过慢,我这里选择用迅雷下载 没python就把那 ...
- Java -----transient 和static
越来越喜欢深究java基础了,讲讲 transient 和static 对序列化的影响.废话少说,直接上代码就可以了 package serializable; import java.io.Ser ...
- BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第12章节--SP 2013中远程Event Receivers 远程Event Receivers App级别生命周期
BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第12章节--SP 2013中远程Event Receivers 远程Event Receivers App级别生命周期 ...