题目传送门
dalao讲解
其实其实比较水,我们只需要列出一个总式子就可以了,用dp[i]表示拼出长度为i的多米诺骨牌需要至少多少次,于是我们枚举一个中间点作为拼成i块多米诺的最后一块,于是我们用El表示拼好左边长度的期望最少次数,Er表示拼好右边长度的期望最少次数,则显然如果我现在不倒的话,有拼好i块长度为Ei
则
Ei = El + Er + 1
这点是显然的,然而无论倒不倒,左边倒或者右边倒,这个El + Er + 1都是必须要用的,在用了这个之后,还需要加上左边倒了重建的期望乘以概率和右边倒了重建的期望乘以概率
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const double inf = 0x3f3f3f3f;
double pl, pr, dp[1000010];
int n;
int main( ) {
while( scanf( "%d", &n ) != EOF && n ) {
scanf( "%lf%lf", &pl, &pr );
for( register int i = 1; i <= n; i++ ) {
dp[i] = inf;
for( register int j = 0; j < i; j++ )
dp[i] = min( dp[i], ( dp[j] * ( 1.0 - pl ) / ( 1.0 - pl - pr ) + dp[ i - 1 - j ] * ( 1 - pr ) / ( 1 - pl - pr ) ) );
dp[i] += ( 1.0 / ( 1.0 - pl - pr ) );
}
printf( "%.2lf\n", dp[n] );
}
return 0;
}