2021.7.15提高B组模拟4T1 彩色圆环(期望dp)
Posted SSL_LKJ
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021.7.15提高B组模拟4T1 彩色圆环(期望dp)相关的知识,希望对你有一定的参考价值。
彩色圆环
输入样例
1.
3 2
2.
200 1
输出样例
1.
2.25
2.
200
解题思路
用期望dp来做
设 f[i][0/1] 为到第 i 个点时
0 表示与前一个数相等
1 表示不等
的期望值
要预处理一个a
f
[
i
]
[
1
]
+
=
1.0
∗
f
[
j
−
1
]
[
0
]
∗
(
i
−
j
+
1
)
∗
a
[
i
−
j
+
1
]
/
m
;
f[i][1]+=1.0*f[j-1][0]*(i-j+1)*a[i-j+1]/m;
f[i][1]+=1.0∗f[j−1][0]∗(i−j+1)∗a[i−j+1]/m;
f
[
i
]
[
0
]
+
=
1.0
∗
f
[
j
−
1
]
[
0
]
∗
(
i
−
j
+
1
)
∗
a
[
i
−
j
+
1
]
∗
(
1.0
∗
(
m
−
2
)
/
m
)
+
1.0
∗
f
[
j
−
1
]
[
1
]
∗
(
i
−
j
+
1
)
∗
a
[
i
−
j
+
1
]
∗
(
1.0
∗
(
m
−
1
)
/
m
)
;
f[i][0]+=1.0*f[j-1][0]*(i-j+1)*a[i-j+1]*(1.0*(m-2)/m)+1.0*f[j-1][1]*(i-j+1)*a[i-j+1]*(1.0*(m-1)/m);
f[i][0]+=1.0∗f[j−1][0]∗(i−j+1)∗a[i−j+1]∗(1.0∗(m−2)/m)+1.0∗f[j−1][1]∗(i−j+1)∗a[i−j+1]∗(1.0∗(m−1)/m);
AC代码
#include<iostream>
#include<cstdio>
using namespace std;
double m,a[205],f[205][2];
int main()
{
int n;
scanf("%d%lf",&n,&m);
a[1]=1.0;
for(int i=2;i<=n;i++)//预处理
a[i]=1.0*a[i-1]/m;
f[0][1]=1.0;
for(int i=1;i<=n;i++)//dp
for(int j=1;j<=i;j++)
{
f[i][1]+=1.0*f[j-1][0]*(i-j+1)*a[i-j+1]/m;
f[i][0]+=1.0*f[j-1][0]*(i-j+1)*a[i-j+1]*(1.0*(m-2)/m)+1.0*f[j-1][1]*(i-j+1)*a[i-j+1]*(1.0*(m-1)/m);
}
double ans=a[n]*n;
for(int i=1;i<n;i++)//求答案
ans+=1.0*f[i][0]*(n-i)*(n-i)*a[n-i];
printf("%.7lf",ans);
return 0;
}
谢谢
以上是关于2021.7.15提高B组模拟4T1 彩色圆环(期望dp)的主要内容,如果未能解决你的问题,请参考以下文章