当前位置: 首页 > news >正文

概率期望dp 复习笔记

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;
}
http://www.zskr.cn/news/16174.html

相关文章:

  • 完整教程:爬虫--以爬取小说为例
  • 仅需3%训练数据的文本归一化技术
  • 完整教程:56、Ocelot 概述
  • 【音视频】FFmpeg 编码H265 - 实践
  • Windows系统安装MySQL Connector 利用C++ VS2022连接MySQL
  • C/C++与Java、Python、Go在各个阶段的区别
  • [省选联考 2025] 图排列 题解
  • 实用指南:UV 包管理工具:替代 pip 的现代化解决方案
  • 2025焚烧炉厂家权威推荐,技术实力与市场口碑深度解析
  • 从价值博弈到价值原语博弈的跃迁:降维解析与升维求解的工程实现——声明Ai研究
  • 2025电缆厂家最新推荐排行榜:深度解析青岛一缆等六家优质企业实力,助力精准选购
  • 1 洛谷题解修正器
  • 防止语言模型性能倒退的新方法
  • 2025 年电永磁吊具制造厂家 TOP 企业品牌推荐排行榜全新发布,含大型电永磁吊具,全覆盖,起重,小型,钢板,钢板电永磁吊具公司推荐!
  • 《独立开发者精选工具》第 019 期
  • [JVM] JVM内存调优 - 教程
  • 在MyBatis中collection属性的命名规则主要取决于传入参数的类型
  • Java求职面试:从Spring到微服务的技术挑战 - 实践
  • 2025CSP-S模拟赛59 比赛总结
  • MCP协议重构AI Agent生态:万能插槽如何终结器具孤岛?
  • Principal v6.15 中文汉化版安装教程|Mac .dmg 文件安装步骤详解
  • 【LUT技术专题】图像自适应3DLUT - 指南
  • ABC426
  • 国庆 Day1 强基化学
  • 实用指南:【发布实录】云原生+AI,助力企业全球化业务创新
  • 深入解析:vscode + cmake + ninja+ gcc 搭建MCU开发环境
  • 2025 年 AI 应用数据泄露防范:以“流式网关”为中枢的链路化治理与合规映射
  • 深入解析:C#学习26天:内存优化的几种方法
  • 2025声级计厂家最新权威推荐排行榜单! 数字声级计,精密声级计,防爆声级计,手持式声级计,剂量声级计公司推荐!