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个数字排成一条直线,然后有两个小伙伴来玩游戏, 每个小伙伴每次可以从两端(左或右)中的任意一端取走一个或若干个数(获得价值为取走数之和) ...
随机推荐
- GSMArena battery life test
GSMArena battery life test Battery Endurance Score = [ Battery Capacity / ( call hrs * a + Browsing ...
- FMDB使用的数据库的三种形式
FMDB使用的数据库的三种形式 FMDB是iOS平台下一款优秀的第三方SQLite数据库框架.它以Objective-C的方式封装了SQLite的C语言API.使用起来,它更加面向对象,避免冗余的 ...
- LightOj 1215 Finding LCM
Discription LCM is an abbreviation used for Least Common Multiple in Mathematics. We say LCM (a, b, ...
- K&R——第五章 指针与数组
#include <stdio.h> #define maxsize 5000 char buf[maxsize]; char *head = buf; char *new(int siz ...
- 554 DT:SPM 163 smtp5,D9GowAD3RPYqSvxZjpMaAA--.4817S2 1509706293 坑爹的防垃圾邮件机制
代码如下 package ssmtest; import java.io.File;import java.io.UnsupportedEncodingException;import java.ut ...
- Extjs grid 单元格事件
celldblclick: function (view, td, cellIndex, record, tr, rowIndex, e, eOpts) { //extjs 4.2下,有时出现,多次不 ...
- win10安装scrapy
前提已经安装好python2.7背景:scrapy框架,windows下的部署工作挺麻烦的.需要用的资源整合了一下可以为以后需要的同学节省不少时间. 相关文件:网盘链接: http://pan.bai ...
- iOS开发 Coretext基本用法
转至 http://blog.csdn.net/fengsh998/article/details/8691823 API接口文档. https://developer.apple.com/libra ...
- 【转载】Spark学习——入门
要学习分布式以及数据分析.机器学习之类的,觉得可以通过一些实际的编码项目入手.最近Spark很火,也有不少招聘需要Spark,而且与传统的Hadoop相比,Spark貌似有一些优势.所以就以Spark ...
- Spring 让 LOB 数据操作变得简单易行,LOB 代表大对象数据,包括 BLOB 和 CLOB 两种类型
转自:https://www.ibm.com/developerworks/cn/java/j-lo-spring-lob/index.html 概述 LOB 代表大对象数据,包括 BLOB 和 CL ...