Dumb Bones UVA - 10529(概率dp)
题意:
你试图把一些多米诺骨牌排成直线,然后推倒它们。但是如果你在放骨牌的时候不小心把刚放的骨牌碰倒了,它就会把相临的一串骨牌全都碰倒,
而你的工作也被部分的破坏了。
比如你已经把骨牌摆成了DD__DxDDD_D的形状,而想要在x这个位置再放一块骨牌。它可能会把左边的一块骨牌或右边的三块骨牌碰倒,而你将不得不重新摆放这些骨牌。
这种失误是无法避免的,但是你可以应用一种特殊的放骨牌方法来使骨牌更多的向一个方向倒下。
给出你要摆放的骨牌数目,以及放骨牌时它向左和向右倒的概率,计算你为完成任务摆放的骨牌数目的平均数。假设你使用了最佳的摆放策略。
输入将包含至多100个测试点,每个测试点占一行,包含需要摆放的骨牌数目n (1≤n≤1000),以及两个非负实数Pl, Pr,表示骨牌向左和向右倒的概率。保证1<Pl+Pr≤0.5。
解析:
假设我们正在放第i个 i的左右两边都已经放好了 那么 有三种情况 左倒 右倒 不倒
设放左边的期望次数为El 放右边的期望次数为Er
那么Ei 就等于相应 情况乘概率然后相加
如果不倒 Ei = El + Er + 1;
如果 左倒 那么我们就要重新放一遍左边 那么次数增加El + 1 次? 仔细想一下 当然不是。。因为如果这次再放的时候又倒了那 所以是Ei - Er
同理 如果右倒 则是 Ei - El
所以 Ei = El + Er + 1 + (Ei - Er)* pl + (Ei - El)* pr;
移项得
Ei = min(Ei, (1 - p1) / (1 - p1 - p2) * El + (1 - p2) / (1 - p1 - p2) * Er + 1 / (1 - p1 - p2);
#include <iostream>#include <cstdio> #include <sstream> #include <cstring> #include <map> #include <cctype> #include <set> #include <vector> #include <stack> #include <queue> #include <algorithm> #include <cmath> #include <bitset> #define rap(i, a, n) for(int i=a; i<=n; i++) #define rep(i, a, n) for(int i=a; i<n; i++) #define lap(i, a, n) for(int i=n; i>=a; i--) #define lep(i, a, n) for(int i=n; i>a; i--) #define rd(a) scanf("%d", &a) #define rlld(a) scanf("%lld", &a) #define rc(a) scanf("%c", &a) #define rs(a) scanf("%s", a) #define pd(a) printf("%d\n", a); #define plld(a) printf("%lld\n", a); #define pc(a) printf("%c\n", a); #define ps(a) printf("%s\n", a); #define MOD 2018 #define LL long long #define ULL unsigned long long #define Pair pair<int, int> #define mem(a, b) memset(a, b, sizeof(a)) #define _ ios_base::sync_with_stdio(0),cin.tie(0) //freopen("1.txt", "r", stdin); using namespace std; const int maxn = 1700, INF = 0x7fffffff, LL_INF = 0x7fffffffffffffff; int n, m, tot; double dp[maxn];int main() {int n;double p1, p2;while(cin >> n >> p1 >> p2){for(int i=1; i<=n; i++){dp[i] = INF;for(int j=0; j<i; j++)dp[i] = min(dp[i], (1 - p1) / (double) (1 - p1 - p2) * dp[j] + (1 - p2) / (double) (1 - p1 - p2) * dp[i - j - 1]);dp[i] += 1 / (double)(1 - p1 - p2);}printf("%.2f\n", dp[n]);}return 0; }
转载于:https://www.cnblogs.com/WTSRUVF/p/9733632.html
Dumb Bones UVA - 10529(概率dp)相关推荐
- 概率DP,递推(麻球繁殖,UVA 11021)
能想到是概率DP,但是定义状态dp[i][j]第i天剩j个麻球.然后麻球数量可能会繁殖到非常多,状态太多数组开不下,然后就不会了. 感觉自己总是轻易就放弃了,还是应该再思考一下,一般遇到这种想到DP但 ...
- UVA10529 Dumb Bones
UVA10529 Dumb Bones go to solution 设$f[i]$表示叠$i$个的骨牌的期望 $O(n)$做法 #include<iostream> #include&l ...
- 小Biu的骰子(概率dp)
小Biu的骰子(概率dp) 题目描述 从左到右有n个方格,每一块方格上有x[i] 块黄金,最初站在第一块方格上,有一个6个面的均匀骰子, 每一个面上的权值是1−6,每次掷骰子之后按照点数y跳到y步之后 ...
- 2018.09.01 poj3071Football(概率dp+二进制找规律)
传送门 概率dp简单题. 设f[i][j]表示前i轮j获胜的概率. 如果j,k能够刚好在第i轮相遇,找规律可以发现j,k满足: (j−1)>>(i−1)(j−1)>>(i−1) ...
- Discovering Gold LightOJ - 1030[概率dp或者记忆化搜索]
题目大意:有一个[1,n][1,n][1,n]的数轴,数轴上的每个对应位置上都有金矿,你初始位置是1,然后你每次都会投色子决定你下一步跳到哪里,如果你跳出了nnn,那么你就要重新投.问你跳到nnn的时 ...
- 【原创】概率DP总结 by kuangbin
概率DP主要用于求解期望.概率等题目. 转移方程有时候比较灵活. 一般求概率是正推,求期望是逆推.通过题目可以体会到这点. 首先先推荐几篇参考的论文: <信息学竞赛中概率问题求解初探> & ...
- poj 3071 Football(概率dp)
http://poj.org/problem? id=3071 大致题意:有2^n个足球队分成n组打比赛.给出一个矩阵a[][],a[i][j]表示i队赢得j队的概率.n次比赛的流程像这样France ...
- HDU 5001 概率DP || 记忆化搜索
2014 ACM/ICPC Asia Regional Anshan Online 给N个点,M条边组成的图,每一步能够从一个点走到相邻任一点,概率同样,问D步后没走到过每一个点的概率 概率DP 測 ...
- hdu 3853 LOOPS 概率DP
简单的概率DP入门题 代码如下: 1 #include<iostream> 2 #include<stdio.h> 3 #include<algorithm> 4 ...
最新文章
- flutter ios启动白屏_Flutter技术架构概览
- TypeScript 3.0 新功能介绍(二)
- 进程的创建与可执行程序的加载
- 不爱沟通的人可以做产品经理嘛?
- python tkinter滚动条不起作用_求助:tkinter中滚动条为什么不能用
- React 小案例 路由跳转
- 第11周多线程 学习总结
- 创建AD域之后设置DNS服务访问外网
- 高并发 问题怎么解决
- 翻译:Swift 5.1中的Protocol面向协议的编程教程:从入门到精通
- 【cc2541历程】APP更改蓝牙设备名称
- ubuntu系统安装socket服务器,ubuntu 服务器安装socket需要安装啥
- heka 输出到mysql_HEKA-系统介绍
- Docker 容器的--restart参数
- notebook pip install 只有星号_什么人不能种生基?什么人适合于做?只有这篇文章最清楚了!...
- chrome浏览器最新离线版下载 30-72版本全
- 【学习笔记】联邦计算
- 悬镜安全 | 第五期 全球一周安全情报(0820-0826)
- 联想启天m420刷bios_联想启天M420c台式机装win7系统及bios设置教程(支持usb驱动)
- 模电数电TTL电平上下拉电阻
热门文章
- nowcoder172C 保护 (倍增lca+dfs序+主席树)
- EL表达式的11隐含对象
- JAVA编程规范-常量定义
- [转]Linux下g++编译与使用静态库(.a)和动态库(.os) (+修正与解释)
- 又见链表 --- 另一种Creat方式与反转
- OA学习笔记-006-SPRING2.5与hibernate3.5整合
- 僵固式思维 OR 成长式思维
- DotNet软件开发框架
- python 多线程为什么鸡肋?
- Python报错UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe0 in position 0: ordinal not in range