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

本文介绍了一种使用动态规划(DP)方法解决特定颜色染色期望问题的算法。通过对题目进行深入分析,作者发现可以通过确定一种颜色并计算其余颜色的期望值来简化问题。文章详细解释了如何构建DP方程,以及如何处理黑洞状态以避免无限循环。通过计算每种颜色的概率和期望,最终得出了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目分析:

好题。

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

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

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

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

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

 

代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 const int maxn = 10200;
 5 char str[maxn];
 6 double h[maxn],f[maxn],g[maxn]; // f->expectation g->possibility
 7 
 8 int cnt[maxn];
 9 double k[maxn],b[maxn];
10 
11 void work(){
12     int ls = strlen(str);
13     for(int i=0;i<=ls;i++) g[i] = (double)i/(double)ls;
14     for(int i=1;i<ls;i++){
15     h[i] = (double)ls*(ls-1)/(double)(2*i*(ls-i));
16     }
17     k[1] = 1; b[1] = h[1];
18     for(int i=2;i<ls;i++){
19     b[i] = h[i]; k[i] = (double)(i+1)/(2*i);
20     double hh = k[i-1]*((double)(i-1)/(2*i));
21     b[i] += b[i-1]*((double)(i-1)/(2*i));
22     k[i] /= (1-hh); b[i] /= (1-hh);
23     }
24     for(int i=ls-1;i>=1;i--){
25     f[i] = f[i+1]*k[i]+b[i];
26     }
27     for(int i=0;i<ls;i++) cnt[str[i]-'A']++;
28     double ans = 0;
29     for(int i=0;i<26;i++) ans += f[cnt[i]]*g[cnt[i]];
30     printf("%.1lf\n",ans);
31 }
32 
33 int main(){
34     scanf("%s",str);
35     work();
36     return 0;
37 }

 

转载于:https://www.cnblogs.com/Menhera/p/10267829.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值