尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

概率期望dp 复习笔记

概率期望dp 复习笔记
📅 发布时间:2026/6/19 5:46:17
## 题目分析 注意到 $a_i\in[1,3]$,故设 $f_{i,j,k}$ 表示现在碗里只有 $1$ 个的有 $i$ 碗,只有 $2$ 个的有 $j$ 碗,只有 $3$ 个的有 $k$ 碗。我们发现从 $f_{x,y,z}$ 推到 $f_{0,0,0}$ 是复杂的。不妨将整个过程反过来变成生产寿司从 $f_{0,0,0}$ 推到 $f_{x,y,z}$ 即可。那么我们有转移: $$ f_{i,j,k}=\frac{n-i-j-k}{n}(f_{i,j,k}+1)+\frac{i}{n}(f_{i-1,j,k}+1)+\frac{j}{n}(f_{i+1,j-1,k}+1)+\frac{k}{n}(f_{i,j + 1,k-1}+1) $$化简有: $$ (i+j+k)f_{i,j,k}=\frac{i}{n}f_{i-1,j,k}+\frac{j}{n}f_{i+1,j-1,k}+\frac{k}{n}f_{i,j+1,k-1}+n $$

Sushi

给你 \(n(1\leq n\leq 300)\) 碗寿司,每碗寿司有 \(a_i(1\leq a_i\leq 3)\) 个,每次进行如下操作:

  • 等概率地得到一个 \(i\),然后如果当前的 \(a_i>0\),就让 \(a_i-1\),否则就不需要做任何事。

求全部吃完的期望操作次数。

题目分析

注意到 \(a_i\in[1,3]\),故设 \(f_{i,j,k}\) 表示现在碗里只有 \(1\) 个的有 \(i\) 碗,只有 \(2\) 个的有 \(j\) 碗,只有 \(3\) 个的有 \(k\) 碗。

我们发现从 \(f_{x,y,z}\) 推到 \(f_{0,0,0}\) 是复杂的。

不妨将整个过程反过来变成生产寿司从 \(f_{0,0,0}\) 推到 \(f_{x,y,z}\) 即可。

那么我们有转移:

\[f_{i,j,k}=\frac{n-i-j-k}{n}(f_{i,j,k}+1)+\frac{i}{n}(f_{i-1,j,k}+1)+\frac{j}{n}(f_{i+1,j-1,k}+1)+\frac{k}{n}(f_{i,j + 1,k-1}+1) \]

化简有:

\[(i+j+k)f_{i,j,k}=\frac{i}{n}f_{i-1,j,k}+\frac{j}{n}f_{i+1,j-1,k}+\frac{k}{n}f_{i,j+1,k-1}+n \]

最后再除过去就可以了,于是你写出了以下的代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <stdlib.h>
#include <vector>
#include <iomanip>
#define int long long
#define N 305
using namespace std;
int n,a[N];
double f[N][N][N];
int sum1,sum2,sum3;
signed main(){cin >> n;for (int i = 1;i <= n;i ++) scanf("%lld",&a[i]);f[0][0][0] = 0.0;for (int i = 1;i <= n;i ++) sum1 += (a[i] == 1),sum2 += (a[i] == 2),sum3 += (a[i] == 3);for (int i = 0;i <= n;i ++)for (int j = 0;j <= n;j ++)for (int k = 0 + (i == j && j == 0);i + j + k <= n;k ++) {if (i) f[i][j][k] = f[i - 1][j][k] * i + f[i][j][k];if (j) f[i][j][k] = f[i + 1][j - 1][k] * j + f[i][j][k];if (k) f[i][j][k] = f[i][j + 1][k - 1] * k + f[i][j][k];f[i][j][k] = (f[i][j][k] + n) / (i + j + k);}cout << fixed << setprecision(10) << f[sum1][sum2][sum3];return 0;
}

这是错的,因为在转移 \(j\) 可行的时候,f_{i+1,j-1,k} 还没有被更新。

这似乎更那个区间 \(dp\) 直接枚举 \(i,j\) 一样是有问题的,于是我们可以像区间 \(dp\) 那样子先枚举长度就行了。

于是你得到:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <stdlib.h>
#include <vector>
#include <iomanip>
#define int long long
#define N 305
using namespace std;
int n,a[N];
double f[N][N][N];
int sum1,sum2,sum3;
signed main(){cin >> n;for (int i = 1;i <= n;i ++) scanf("%lld",&a[i]);f[0][0][0] = 0.0;for (int i = 1;i <= n;i ++) sum1 += (a[i] == 1),sum2 += (a[i] == 2),sum3 += (a[i] == 3);for (int len = 1;len <= n;len ++)for (int i = 0;i <= n;i ++)for (int j = 0;i + j <= len;j ++) {int k = len - i - j;f[i][j][k] = 0;if (i) f[i][j][k] += f[i - 1][j][k] * i;if (j) f[i][j][k] += f[i + 1][j - 1][k] * j;if (k) f[i][j][k] += f[i][j + 1][k - 1] * k;f[i][j][k] = (f[i][j][k] + n) / (i + j + k);}cout << fixed << setprecision(10) << f[sum1][sum2][sum3];return 0;
}

这还是错的,同样的错误,应该从 \(k\) 到 \(j\) 枚举。

代码

时间复杂度 \(\mathcal{O}(n^3)\),代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <stdlib.h>
#include <vector>
#include <iomanip>
#define int long long
#define N 305
using namespace std;
int n,a[N];
double f[N][N][N];
int sum1,sum2,sum3;
signed main(){cin >> n;for (int i = 1;i <= n;i ++) scanf("%lld",&a[i]);f[0][0][0] = 0.0;for (int i = 1;i <= n;i ++) sum1 += (a[i] == 1),sum2 += (a[i] == 2),sum3 += (a[i] == 3);for (int len = 1;len <= n;len ++)for (int k = 0;k <= len;k ++)for (int j = 0;k + j <= len;j ++) {int i = len - k - j;f[i][j][k] = 0;if (i) f[i][j][k] += f[i - 1][j][k] * i;if (j) f[i][j][k] += f[i + 1][j - 1][k] * j;if (k) f[i][j][k] += f[i][j + 1][k - 1] * k;f[i][j][k] = (f[i][j][k] + n) / (i + j + k);}cout << fixed << setprecision(10) << f[sum1][sum2][sum3];return 0;
}

相关新闻

  • 【计网】第六章(网络层)习题测试 - 实践
  • 04-delphi10.3下PDFium5.8的PdfView1查找文本
  • 完整教程:HTTPS

最新新闻

  • 6个免费方法让你的手机视频秒变MP4 - 软件工具教程方法
  • Kali Linux实战:ARP欺骗攻击原理、环境搭建与Wireshark流量分析
  • 杭州靠谱品牌首饰回收排行,光谱验金透明称重全款现结 - 奢品小当家
  • 2026年安徽省合肥市合肥医药卫生学校招生简章官网发布:报名入口+报考指南 - cc江江
  • 武汉钻石回收怎么选?2026年实测合规机构名录 - 薛定谔的梨花猫
  • 机器学习模型上线后如何应对系统性风险与数据漂移

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号