Dumb Bones UVA - 10529[多米诺重构]
Dumb Bones
题意
你试图把一些多米诺骨牌排成直线,然后推倒它们。但是如果你在放骨牌的时候不小心把刚放的骨牌碰倒了,它就会把相临的一串骨牌全都碰倒,而你的工作也被部分的破坏了。
比如你已经把骨牌摆成了DD__DxDDD_D的形状,而想要在x这个位置再放一块骨牌。它可能会把左边的一块骨牌或右边的三块骨牌碰倒,而你将不得不重新摆放这些骨牌。
这种失误是无法避免的,但是你可以应用一种特殊的放骨牌方法来使骨牌更多的向一个方向
分析
首先应该明确怎样找到最佳的摆放策略。我们可以考虑在位置i放最后一块骨牌。显然,i前面的i-1块骨牌和i后面的n-i块骨牌是互不影响的。所以我们假设摆放i-1块骨牌需要的次数平均是(或说期望是)E1,摆放n-i块骨牌需要的次数平均是E2。那么我们摆放了这两段之后,就要把最后一块放上。这时如果把左边的碰倒了,就只好重新摆放。右边的也是同样的道理。所以需要摆放的平均值(E)是:
E = E1 + E2 +
这个式子的推导并不困难,方法之一就是应用方程的思想(参见后面介绍的概率—期望系统)。
既然得到了这个式子,我们就可以通过动态规划来得到最优的摆放方案。设Ei是摆放i块骨牌所需要的最少期望次数,那么状态转移方程是:
Ei = min{Ek + Ei-1-k + } (0≤k≤i-1)
这样就得到了一个O(n2)的算法。根据题目中的数据规模,最大的运算量是100*10002 = 108,虽然可以忍受,但是还是比较慢的,如果数据稍大一点就容易超时。
这就需要我们对动态规划进行优化。
这是一个1D/1D的动态规划,我们自然希望得到O(n)的算法,而这种优化一般都是通过动态规划的方程性质得到的。
观察动态规划的方程,我们可以发现,当k从0变化到i-1时第一项是不断增大的,第二项是不断减小的,第三项则是一个常数。因此整个函数一定是单峰的,这样就可以通过二分的方法进行优化,复杂度已经降到了O(nlogn)。而事实上,E这个数列不但是单增的,而且是凹的(如果PlPr=0就不凹也不凸,但是这不影响这里的讨论),通过这个性质我们还可以证明决策使用的k一定是不减的(证明很简单,略去)。这样通过记录上一次决策使用的k,就得到了一个(均摊的)O(n)的算法。
Select Code
#include<cstdio>
using namespace std;
const int N=1e5+5;
double pl,pr,f[N];
int n;
double get(int i,int k){
return ((1-pr)*f[k]+(1-pl)*f[i-k-1]+1)/(1-pl-pr);
}
int main(){
for(scanf("%d",&n);n;scanf("%d",&n)){
scanf("%lf%lf",&pl,&pr);
for(int i=1,j=0;i<=n;i++){
for(;j<i-1&&get(i,j+1)<get(i,j);j++);
f[i]=get(i,j);
}
printf("%.2lf\n",f[n]);
}
return 0;
}
Dumb Bones UVA - 10529[多米诺重构]的更多相关文章
- Dumb Bones UVA - 10529(概率dp)
题意: 你试图把一些多米诺骨牌排成直线,然后推倒它们.但是如果你在放骨牌的时候不小心把刚放的骨牌碰倒了,它就会把相临的一串骨牌全都碰倒, 而你的工作也被部分的破坏了. 比如你已经把骨牌摆成了DD__D ...
- UVA 10529 - Dumb Bones(概率+区间dp)
UVA 10529 - Dumb Bones option=com_onlinejudge&Itemid=8&category=518&page=show_problem&am ...
- UVA 10529 Dumb Bones 可能性dp 需求预期
主题链接:点击打开链接 题意: 要在一条直线上摆多米诺骨牌. 输入n, l, r 要摆n张排,每次摆下去向左倒的概率是l, 向右倒的概率是r 能够採取最优策略.即能够中间放一段.然后左右两边放一段等, ...
- 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 ...
- 多米诺(codevs 3052)
题目描述 Description 一个矩形可以划分成M*N个小正方形,其中有一些小正方形不能使用.一个多米诺骨牌占用两个相邻的小正方形.试问整个区域内最多可以不重叠地放多少个多米诺骨牌且不占用任何一个 ...
- [CareerCup] 6.2 Dominos on Chess Board 棋盘上的多米诺
6.2 There is an 8x8 chess board in which two diagonally opposite corners have been cut off. You are ...
- 【Tsinghua OJ】多米诺骨牌(domino)问题
(domino.c/cpp)[问题描述] 小牛牛对多米诺骨牌有很大兴趣,然而她的骨牌比较特别,只有黑色和白色的两种.她觉 得如果存在连续三个骨牌是同一种颜色,那么这个骨牌排列便是不美观的.现在她有n个 ...
- 省选训练赛第4场D题(多米诺骨牌)
题目来自FZU2163 多米诺骨牌 Time Limit: 1000 mSec Memory Limit : 32768 KB Problem Description Vasya很喜欢排多米诺 ...
- wikioi3052 多米诺
题目描述 Description 一个矩形可以划分成M*N个小正方形,其中有一些小正方形不能使用.一个多米诺骨牌占用两个相邻的小正方形.试问整个区域内最多可以不重叠地放多少个多米诺骨牌且不占用任何一个 ...
随机推荐
- 机器学习——大数据与MapReduce
MapReduce是一个分布式计算框架 优点:可在短时间内完成大量工作 缺点:算法必须经过重写,需要对系统工程有一定的理解 使用数据类型:数值型和标称型数据 MapReduce在大量节点组成的集群上运 ...
- 和我一起学《HTTP权威指南》——Web服务器
Web服务器 Web服务器会做些什么 1.建立连接(接受或关闭一个客户端连接) 2.接收请求(读取HTTP报文) 3.处理请求(解释请求报文并采取行动) 4.访问资源 5.构建响应(创建带有正确首部的 ...
- windows下用php实现svn代码更新
windows下的服务器 没有登录权限,如何从svn更新代码 用php页面,实现更新代码 $cmd = '"C:\Program Files\TortoiseSVN\bin\Tortoise ...
- PHP 数组current和next用法
1.current 当前数组 <?php $transport = array('foot', 'bike', 'car', 'plane'); $mode = current($trans ...
- Ajax请求全局配置
摘要: jQuery已经成为项目中最常见的js库,也是前端开发最喜欢使用的库.下面是在项目中封装了jQuery的Ajax,分享给大家. 代码: // ajax 请求参数 var ajaxSetting ...
- Chrome扩展应用
现在越来越多的用户将chrome浏览器设置为自己默认的浏览器,不仅是因为他的界面美,最重要的是他对html5和CSS3完美的支持,且调试工具非常好用,还有丰富的扩展库.如何安装自己的扩展呢? 点击自定 ...
- java okhhtp下载学信网学籍信息
学信网的登录有验证码,是那种计算数字或者汉字识别的,很难识别.最近连学籍信息和学历信息也换成图片了,常规的正则 css xpath都不能使. 下载图片,需要先登录,获取登陆后的cookie和学籍信息的 ...
- MTK 精简ROM
PhaseBeam.apk--------------------------------------动态壁纸光之韵律(可删) Phone.apk--------------------------- ...
- web实现QQ头像上传截取功能
由于最近一段时间比较忙,发现好久没写博客了,给大家分享下最近搞的logo上传截取功能.在实现这个功能之前找了一些jq的插件,最后选定了cropper在github中可以找到. 具体的思路是1:选择上传 ...
- Uva--11324--The Largest Clique【有向图强连通分量】
链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&am ...