UVA10529 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