UVA 10529 Dumb Bones

#include <iostream>
#include <stdio.h>
#include <cstring>
#define MAX 1010
using namespace std;
double pl,pr;
double data[MAX];

void Init()
{
    memset(data, 0, sizeof(data));
}

double dp(int n)
{
    double temp;
    int l,r;
    if(n==0)
        return 0;
    if(data[n]>0)
        return data[n];

    for(int i=1;i<=n;i++)
    {
        l=i-1;
        r=n-i;
        temp = dp(l)+dp(r)+(dp(l)*pl+dp(r)*pr+1)/(1-pl-pr);
        if(i==1)
            data[n] = temp;
        else if(temp < data[n])
            data[n] = temp;
    }
    return data[n];
}

int main()
{
    int n;
    while(scanf("%d%lf%lf",&n,&pl,&pr)!=EOF && n!=0)
    {
        Init();
        printf("%.2lf
", dp(n));
    }
    return 0;
}
原文地址:https://www.cnblogs.com/tuty/p/4856634.html