题目链接:https://vjudge.net/problem/UVA-10529

知识点:  概率与期望,DP。

题目大意:

  现要放置 \(n\) 个多米诺骨牌,且每放置一块多米诺骨牌有 \(P_l\) 的概率向左倒,其左边相邻的骨牌也会随之倒下;有 \(P_r\) 的概率向右倒,其右边相邻的骨牌同上。问要放置 \(n\) 块相连的一排骨牌所需要的放置次数的最小期望是多少?

  \(1 \le n \le 100\)

  \(0 < P_l + P_r \le 0.5\)

解题思路:

  我们用动态规划的方法来解决这个问题。

  设 \(dp(i)\) 为放置 \(i\) 块相连的一排骨牌所需要的放置次数的最小期望,我们先给出状态转移方程:

  \(dp(i) = min\{ dp(i), \frac{dp(l) \cdot P_l + dp(r) \cdot P_r + 1}{1-P_l-P_r} + dp(l) + dp(r) \mid 0 \le l \le i, r = i-1-l \}\)  

  上式中,我用 \(l\) 表示放置第 \(i\) 块骨牌(即最后一块)的时候左边的相连的骨牌数,\(r\) 则表示右边的。我们可以用 \((l,r)\) 来表示我们放置最后一块骨牌的位置,则当我们在 \((l,r)\) 放置最后一块骨牌时,放置这 \(i\) 块连续的骨牌所需要的次数的期望为 \(E = E(i) + dp(l) +dp(r)\),我们事先已经知道了 \(dp(k) \{0 \le k < i\}\),故重点就在于求解 \(E(i)\) ,即放置第 i 块所需的放置次数的期望。首先,我们需要知道:每放置一块多米诺骨牌有 \(1 - P_l - P_r\) 的概率不会倒。接下来,我们分成如下三种情况来讨论:

  1、放置一次即成功,有 \(1 - P_l - P_r\) 的概率。则放置次数的期望为:\(\frac{1}{1 - P_l - P_r}\) ;

  2、放置以后向左倒,有 \(P_l\) 的概率。我们需要先将左边的骨牌放置好,我们需要放置成功 \(dp(l)\) 次,每一次的成功概率都为 \(1 - P_l - P_r\),则需要的次数的期望为 \(\frac{dp(l)}{1-P_l-P_r}\),当然,我们也不能忘了乘上 \(P_l\),则最终的期望值为:\(\frac{P_l \cdot dp(l)}{1-P_l-P_r}\);

  3、放置以后向右倒同理。

  于是,我们不难推出:

  \(E = \frac{dp(l) \cdot P_l + dp(r) \cdot P_r +1}{1 - P_l - P_r} + dp(l) + dp(r)\)  .

  一切也就顺理成章了。

AC代码:

 #include <iostream>
#include <cstdio> using namespace std;
const int maxn=;
const double inf=0x7fffffff;
double dp[maxn];
int main()
{
int n;
double pl,pr;
while(scanf("%d",&n)==&&n){
scanf("%lf%lf",&pl,&pr);
for(int i=;i<=n;i++) dp[i]=inf;
dp[]=;
int l,r;
for(int i=;i<=n;i++){
for(l=;l<i;l++){
r=i--l;
dp[i]=min(dp[i],(dp[l]*pl+dp[r]*pr+)/(-pl-pr)+dp[l]+dp[r]);
}
}
printf("%.2lf\n",dp[n]);
}
return ;
}

  PS: 此题还有一种 \(O(nlog n)\) 和一种 \(O(n)\) 的算法,未完待续。

UVA10529 Dumb Bones (完成度:40%)的更多相关文章

  1. UVA10529 Dumb Bones

    UVA10529 Dumb Bones go to solution 设$f[i]$表示叠$i$个的骨牌的期望 $O(n)$做法 #include<iostream> #include&l ...

  2. 2018.09.09 UVa10529 - Dumb Bones(期望dp)

    传送门 期望dp好题. f[i]表示摆放i个的最小花费,于是f[i]可以从f[j]与f[i-j+1]转移过来了. 代码: #include<bits/stdc++.h> #define N ...

  3. Dumb Bones UVA - 10529[多米诺重构]

    Dumb Bones UVA - 10529   来自绿书p176  题意 你试图把一些多米诺骨牌排成直线,然后推倒它们.但是如果你在放骨牌的时候不小心把刚放的骨牌碰倒了,它就会把相临的一串骨牌全都碰 ...

  4. UVA 10529 - Dumb Bones(概率+区间dp)

    UVA 10529 - Dumb Bones option=com_onlinejudge&Itemid=8&category=518&page=show_problem&am ...

  5. UVA 10529 Dumb Bones 可能性dp 需求预期

    主题链接:点击打开链接 题意: 要在一条直线上摆多米诺骨牌. 输入n, l, r 要摆n张排,每次摆下去向左倒的概率是l, 向右倒的概率是r 能够採取最优策略.即能够中间放一段.然后左右两边放一段等, ...

  6. [UVA 10529]Dumb Bones

    题面在这里 题意 放\(n\)个相连的骨牌,每次放的时候有\(pl\)的概率往左倒,有\(pr\)的概率往右倒,骨牌倒的时候可能会打翻左边相邻或者右边相邻的骨牌,并引起连锁反应直到最后一个骨牌旁边没有 ...

  7. Dumb Bones UVA - 10529(概率dp)

    题意: 你试图把一些多米诺骨牌排成直线,然后推倒它们.但是如果你在放骨牌的时候不小心把刚放的骨牌碰倒了,它就会把相临的一串骨牌全都碰倒, 而你的工作也被部分的破坏了. 比如你已经把骨牌摆成了DD__D ...

  8. #11 UVA 10529 Dumb Bones

    题意: 放一堆排,每放一张,有pa的概率让左边的全倒,有pb的概率让右边全倒 问在最优策略下,最少要放几张才能摆放出n张 1<=n<=1000 题解: 这题应该还是很经典的 首先是期望部分 ...

  9. Dumb Bones(uva 10529)

    题意:给定n,表示要放n个骨牌,每次放下骨牌,有可能向左倒的概率为pl,向右倒的概率为pr,如果倒下,会将那一侧的骨牌全部推倒,可以选择位置先后放骨牌,问说一种放骨牌次数最少的期望是多少. /* 设d ...

随机推荐

  1. 多线程并行请求问题及SplashActivity预加载问题解决方案

    1. 问题描述(一): 现有3个线程thread1, thread2, thread3.这3个线程是并发执行的,当着3个线程都执行完成以后,需要执行一个finish()事件. 1.1 实现方法: /* ...

  2. Linux 用户管理和提权

    Linux ⽀持多个⼈使⽤同⼀个⽤户登录系统, Windows 在修改组策略的情况下,也可以多个⼈使⽤同⼀个⽤户登录 远程连接Linux的⽅式:SSH协议 远程连接Windows的⽅式:RDP协议 安 ...

  3. 【集群实战】Rsync数据同步工具

    1. Rsync介绍 1.1 什么是Rsync? Rsync是一款开源的,快速的,多功能的,可实现全量及增量的本地或远程数据同步备份的优秀工具.Rsync软件适用于unix/linux/windows ...

  4. 【DNS域名解析命令】 nslookup

    1. nslookup作用 nslookup用于查询DNS的记录,查询域名解析是否正常,在网络故障时用来诊断网络问题 nslookup - query Internet name servers in ...

  5. Redis介绍及字符串操作

    一.前言 不同程序之间实现通信的方法? A.通过不同程序之间建立socket,实现通信.实际应用适用于使用broker,如RabbitMQ,ZeroMQ. B.通过Json,Pickle,利用文件的写 ...

  6. python操作ftp文件

    from ftplib import FTP ftp = FTP('ftp.abc.com') ftp.login(user='username', passwd='********') ftp.cw ...

  7. 自定义fastjson对枚举类型的序列化及反序列化过程

    通常,fastjson在序列化及反序列化枚举时,一般以下几种策略: 1).根据枚举的name值序列化及反序列化(默认) 2).根据枚举的ordinal序列化及反序列化 3).根据枚举的toString ...

  8. 一个页面从输入url到页面加载完成究竟经历了些什么

    本人经参考谢希仁著<计算机网络(第 5版)>.<HTTP权威指南>和网络上关于浏览器渲染原理的介绍,结合自己理解,整理出以下结论,如有不正确或者不完善之处欢迎指正: 当用户在浏 ...

  9. 图论--拓扑排序--判断是否为DAG图

    #include<cstdio> #include<cstring> #include<vector> #include<queue> using na ...

  10. 什么才是Python的高级编程?大牛总结,绝对让你受益匪浅

    很多刚入门或者还在了解的小伙伴们都会遇到迷茫期吧,就是学完这些基础,函数,字典啥的,好像也做不了什么东西,其实你基础学的扎实的话,是能做很多的事的,学完基础也不要迷茫,因为每门语言都是博大精深的,不是 ...