BZOJ2554 color 【概率DP】【期望DP】

题目分析:

好题。

一开始看错题了,以为是随机选两个球,编号在前的染编号在后的。

但这样仍然能获得一些启发,不难想到可以确定一个颜色,剩下的颜色是什么就无关了。

那么答案就是每种颜色的概率乘以期望。概率很好求。

考虑期望,这里存在一个"黑洞",也就是f[0]状态无论如何也不可能填满颜色,所以我们要舍弃这个状态,这样往左和往右的转移就不是对半了。

通过求出的概率作比可以发现实际上是i-1:i+1。所以可以列出DP方程

代码:

 #include<bits/stdc++.h>
using namespace std; const int maxn = ;
char str[maxn];
double h[maxn],f[maxn],g[maxn]; // f->expectation g->possibility int cnt[maxn];
double k[maxn],b[maxn]; void work(){
int ls = strlen(str);
for(int i=;i<=ls;i++) g[i] = (double)i/(double)ls;
for(int i=;i<ls;i++){
h[i] = (double)ls*(ls-)/(double)(*i*(ls-i));
}
k[] = ; b[] = h[];
for(int i=;i<ls;i++){
b[i] = h[i]; k[i] = (double)(i+)/(*i);
double hh = k[i-]*((double)(i-)/(*i));
b[i] += b[i-]*((double)(i-)/(*i));
k[i] /= (-hh); b[i] /= (-hh);
}
for(int i=ls-;i>=;i--){
f[i] = f[i+]*k[i]+b[i];
}
for(int i=;i<ls;i++) cnt[str[i]-'A']++;
double ans = ;
for(int i=;i<;i++) ans += f[cnt[i]]*g[cnt[i]];
printf("%.1lf\n",ans);
} int main(){
scanf("%s",str);
work();
return ;
}
上一篇:PowerDesigner 企业架构模型 ( EAM )


下一篇:ie11的版本判断