ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

UVA10529 Dumb Bones

2021-06-11 11:35:23  阅读:224  来源: 互联网

标签:Pr frac int 摆放 times Dumb Bones UVA10529 Pl


Dumb Bones

摆放多米诺骨牌,摆牌时有 \(P_l\) 的概率向左倒,\(P_r\) 的概率向右倒,倒了就一排都要倒。

假设每次按照最优摆放方式,求期望摆放次数。

看上去就很 DP。

设 \(f(i)\) 表示摆放好 \(i\) 块多米诺骨牌的期望次数。

显然 \(f(i)=\min_{1\leq j\leq i}\{f(j-1)\times\frac{1-P_r}{1-P_l-P_r}+f(i-j)\times \frac{1-P_l}{1-P_l-P_r}+\frac{1}{1-P_l-P_r}\}\)。

好像不是很显然的样子

首先需要知道,假设一个事件发生的概率为 \(P\),每次执行一次操作,则该事件发生的期望次数为 \(\frac{1}{P}\)。

所以该牌放好的期望步数为 \(\frac{1}{1-P_l-P_r}\)。

那么之前就要走 \(\frac{1}{1-P_l-P_r}-1=\frac{P_l+P_r}{1-P_l-P_r}\) 步。

然后分向左向右两种情况,以向左为例,显然向左倒的期望次数为 \(\frac{P_l+P_r}{1-P_l-P_r}\times \frac{P_l}{P_l+P_r}=\frac{P_l}{1-P_l-P_r}\)。

当你倒了这么多次时,重新摆放的次数显然要 \(+1\),因为最后即使你摆成功了,也要将已经倒了的左边摆好。

所以总期望次数为 \(\frac{P_l}{1-P_l-P_r}+1=\frac{1-P_r}{1-P_l-P_r}\)。

右边同理。

然后你就有可能凭借 \(O(100\times 1000^2)\) 过掉这道题,但是不够高效。

不难通过观察或证明得到决策单调性,即 \(j\) 取到 min 的决策点单调递增,于是就可以 \(O(n)\) 解决了。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

const int N = 1010;
int n;
double Pl, Pr, f[N]; 

double Get(int i, int j){
	return f[j] * (1 - Pr) / (1 - Pl - Pr) 
	+ f[i - j - 1] * (1 - Pl) / (1 - Pl - Pr)
	+ 1 / (1 - Pl - Pr);
}

int main(){
	while(~scanf("%d", &n) && n){
		scanf("%lf %lf", &Pl, &Pr);
		for(int i = 1, j = 0; i <= n; i ++){
			while(j < i - 1 && Get(i, j) > Get(i, j + 1))
				j ++;
			f[i] = Get(i, j);
		}
		printf("%.2lf\n", f[n]);
	}
	return 0;
}

标签:Pr,frac,int,摆放,times,Dumb,Bones,UVA10529,Pl
来源: https://www.cnblogs.com/lpf-666/p/14874430.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有