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\n", dp(n)); } return 0; }