这题有点小绕,其实举个例子就很明显了:已知1个乘客f(1)时,第1位乘客坐在自己的座位上的概率概率是1;2个乘客f(2)时,第2位乘客坐在自己的座位上的概率概率是0.5;3个乘客f(3)时,就会分成以下三种情况:
- 乘客1坐在乘客1座位上,概率为f(1)=1
- 乘客1坐在乘客3座位上,概率为f(0)=0
- 乘客1坐在乘客2座位上,此时有乘客2、乘客3,座位1、座位3,要使乘客3坐在正确的座位上,就和f(2)的情况是一样的,即概率为f(2)=0.5
那么f(3)=(0+1+0.5)/3,根据递推式得代码:
class Solution {
public:
double nthPersonGetsNthSeat(int n) {
vector<double> dp(n + 1);
dp[1] = 1.0;
double sum = 0.0;
for(int i = 2; i <= n; ++i) {
sum += dp[i - 1];
dp[i] = sum / (double)i;
}
return dp[n];
}
};