poj 3682(期望dp)

传送门

题解:

设g[i]表示已经有i次正面,要到k次的期望次数。

g[i]=p*g[i+1]+(1-p)*g[i]+1

g[i]=g[i+1]+1/p

边界:g[k]=0

设f[i]表示已经有i次正面,要到k次的期望花费。

f[i]=p*(f[i+1]+2*(g[i+1]+1)-1)+(1-p)*(f[i]+2*(g[i]+1)-1)

移项化简即可。

边界f[k]=0。

P.S.poj不支持%lf。。。使用%f输出。

#include
#include
#include
#include
using namespace std;
int n;
double p;
double g[1002],f[1002];
int main() {
	while (scanf("%d",&n)&&n) {
		scanf("%lf",&p);
		g[n]=0;
		for (int i=n-1;~i;--i) g[i]=g[i+1]+1.0/p;
		f[n]=0;
		for (int i=n-1;~i;--i) f[i]=(p*(f[i+1]+2.0*g[i+1]+1)+(1.0-p)*(2.0*g[i]+1))/p;
		printf("%.3f %.3f\n",g[0],f[0]);
	}
	return 0;
}


你可能感兴趣的:(dp)