题目大意:
有三个骰子,分别有K1,K2,K3个面,一次投掷可以得到三个骰子点数加和的分数,但是,当骰子1等于A,骰子2=B,骰子3=C时,结果清零。问从0开始,分数超过N时投掷次数的期望。
问题分析:
在网上找了好多题解,基本上都是一样的,看了好久才看懂,觉得有必要写一下这题的题解。
1、在刚看到这题的时候,就想着用暴力方法解决,直接枚举次数,计算概率:
dp[i][j]-->d[i+1][j+k],dp[i+1][0](dp表示前i次,得到j的概率)
但是,在TLE之后果断放弃了。
2、既然暴力不行,不妨换个角度来思考。设E[i]表示从i分开始,需要投掷几次才能超过N的期望,那么,就能推出递推式:E[i]=sum(E[i+k]*P[k])+E[0]*P[0]+1(就这个公式,看了好久看不懂T_T)其实就是从E[i]可以转移到E[i+k],花费一次掷骰子的机会,且概率是P[k],反向来看就是E[i]到结束的次数应该是E[i+k]的次数加一,并且是考虑概率的。
如果说考虑到这一点并不难,因为只是把角度改为了逆推,那么下面的这个变形就真的是完全想不到了:
看到上面的递推式分为两部分:与E[0]有关和与它无关,于是将E[i]构造成一个关于它的式子:
E[i]=A[i]*E[0]+B[i]
然后带入原方程:
E[i]=sum(A[i+k]*E[0]*P[k]+B[i]*P[k])+E[0]*P[0]+1
=(sum(A[i+k]*P[k])+P[0])*E[0]+sum(B[i]*P[k])+1
所以A[i]=sum(A[i+k]*P[k])+P[0]
B[i]=sum(B[i]*P[k])+1
得到这个式子之后就可以用O(N*K)的递推求出A[0]和B[0]了。
在带回到构造出的方程中:E[0]=A[0]*E[0]+B[0],变形后就得到结果了。