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个数字排成一条直线,然后有两个小伙伴来玩游戏, 每个小伙伴每次可以从两端(左或右)中的任意一端取走一个或若干个数(获得价值为取走数之和) ...
随机推荐
- Perl语言入门--3--perl的控制结构
表达式真假值总结: 表达式不一定是逻辑表达式,但一定要得出真假值 假值:逻辑值为假 值为0 字符串为空 列表为空 undef 其他情况为真 1.if {} elsif {} else {} 2.u ...
- PHP文件函数
PHP文件函数 函数 描述 PHPbasename() 返回路径中的文件名部分. 3chgrp() 改变文件组. 3chmod() 改变文件模式. 3chown() 改变文件所有者. 3clearst ...
- SqlHelper类-全面
// ===============================================================================// Microsoft Data ...
- 一维数组解最长上升公共子序列(LCIS)
#include<bits/stdc++.h> using namespace std; + ; int n,a[maxn],b[maxn],dp[maxn]; int main() { ...
- 可能是全网最详细的express--middleware
写在前面 hello,小伙伴们,我是你们的pubdreamcc,本篇博文出至于我的GitHub仓库node学习教程资料,欢迎小伙伴们点赞和star,你们的点赞是我持续更新的动力. GitHub仓库地址 ...
- sed理论讲解、实战
1.Sed是操作.过滤和转换文本内容的强大工具,常用功能有增删改查.过滤.取行. options(常用参数): -n:使用安静(silent)模式,在一般 sed 的用法中,所有来自 STDIN 的数 ...
- linux 用户管理命令学习
groupadd www-data 添加组 useradd phpcomposer -g www-data 添加用户并加入组中 passwd phpcomposer 添加密码 usermod -g p ...
- 第十讲_图像检索 Image Retrieval
第十讲_图像检索 Image Retrieval 刚要 主要是图像预处理和特征提取+相似度计算 相似颜色检索 算法结构 颜色特征提取:统计图片的颜色成分 颜色特征相似度计算 色差距离 发展:欧式距离- ...
- 【iOS开发-58】tableView初识:5个重要方法的使用和2种样式的差别
创建一个tableView,直接拖拽放在storyboard里面就可以. (1)先创建一个数据模型类WSCarGroup,在WSCarGroup.h文件里: #import <Foundatio ...
- Oracle Apex 有用笔记系列 6 - 可编辑交互报告 Editable Interactive Report
据笔者所知.Apex 4.x 是没有提供可编辑交互报告组件的.这就须要我们手动实现. 事实上这也并非非常复杂,仅仅须要简单几步. 1. 依据向导建立一个interactive report.查询语句能 ...