分析
那么首先设
f
[
i
]
f[i]
f[i]表示现在有
i
i
i张邮票取完所有邮票的期望次数
那么
f
[
i
]
=
i
n
∗
f
[
i
]
+
n
−
i
n
f
[
i
+
1
]
+
1
f[i]=\frac{i}{n}*f[i]+\frac{n-i}{n}f[i+1]+1
f[i]=ni∗f[i]+nn−if[i+1]+1
化简得到
f
[
i
]
=
f
[
i
+
1
]
+
n
n
−
i
,
f
[
n
]
=
0
f[i]=f[i+1]+\frac{n}{n-i},f[n]=0
f[i]=f[i+1]+n−in,f[n]=0
然后设
d
p
[
i
]
dp[i]
dp[i]表示现在有
i
i
i张邮票取完所有邮票的期望花费
那么
d
p
[
i
]
=
i
n
(
d
p
[
i
]
+
f
[
i
]
+
1
)
+
n
−
i
n
(
d
p
[
i
+
1
]
+
f
[
i
+
1
]
+
1
)
dp[i]=\frac{i}{n}(dp[i]+f[i]+1)+\frac{n-i}{n}(dp[i+1]+f[i+1]+1)
dp[i]=ni(dp[i]+f[i]+1)+nn−i(dp[i+1]+f[i+1]+1)
化简得到
d
p
[
i
]
=
i
n
−
i
(
f
[
i
]
+
1
)
+
d
p
[
i
+
1
]
+
f
[
i
+
1
]
+
1
dp[i]=\frac{i}{n-i}(f[i]+1)+dp[i+1]+f[i+1]+1
dp[i]=n−ii(f[i]+1)+dp[i+1]+f[i+1]+1
代码
#include <cstdio>
#define rr register
using namespace std;
double dp1,dp2,tp1,tp2; int n;
signed main(){
scanf("%d",&n);
for (rr int i=n-1;~i;--i)
tp1=tp2+n*1.0/(n-i),dp1=1.0*i/(n-i)*(tp1+1)+dp2+tp2+1,tp2=tp1,dp2=dp1;
return !printf("%.2lf",dp1);
}