J - Sushi

# 一级标题 J - Sushi

题目大意:

N个盘子,每个盘子中有1到3个寿司不等,T总每次随机选一个盘子,取一个寿司若没有则不取,求全部取完的期望次数
关于期望dp请转移概率dp
数据范围N ∈ \in [1, 300].
提示:考虑dp


考虑设置dp状态

*** 很明显的三维 d p i , j , k dp_i,_j,_k dpi,j,k 表示盛一个寿司的盘子有i个,盛两个寿司的有j个,盛三个寿司的有k个的期望次数。
设开始时一个的有x个,两个寿司的有y个,盛三个寿司的有z个.


考虑转移:

W A Y 1 : 倒推 WAY1: 倒推\rm WAY1:倒推(目标状态到初始状态)
d p i , j , k dp_i,_j,_k dpi,j,k表示从0,0,0到i,j, k的期望次数,
初始化 d p 0 , 0 , 0 dp_0,_0,_0 dp0,0,0 = 0; 目标状态 d p x , y , z dp_x,_y,_z dpx,y,z
转移方式:
首先, 每一次选到当前状态下有寿司的盘子有 n i + j + k \frac{n}{i + j + k} i+j+kn的期望次数
然后,有 i i + j + k \frac{i}{i + j + k} i+j+ki的概率转移到 d p i − 1 , j , k dp_i -1,_j,_k dpi1,j,k
j i + j + k \frac{j}{i + j + k} i+j+kj的概率转移到 d p i + 1 , j − 1 , k dp_i +1 ,_ j-1,_k dpi+1,j1,k
k i + j + k \frac{k}{i + j + k} i+j+kk的概率转移到 d p i , j + 1 , k − 1 dp_i,_j+1,_k-1 dpi,j+1,k1
所以`


				dp[i][j][k] += (double)(1.0 * n / (i + j + k));
				if (i >= 1) dp[i][j][k] += (dp[i - 1][j][k] * (1.0 * i / (i + j + k)));
				if(j >= 1) {
					dp[i][j][k] += dp[i + 1][j - 1][k] * (1.0 * j / (i + j + k));
				} 
				if (k >= 1){
					dp[i][j][k] += dp[i][j + 1][k - 1] * (1.0 * k / (i + j + k));
				}

Points:i,j, k的枚举顺序;i,j,k是否都为零的判断;i,j,k的枚举范围。
W A Y 2 : 正推 WAY2:正推\bf WAY2:正推
话说期望dp一般都是倒推的呢

d p i , j , k dp_i,_j,_k dpi,j,k表示从i, j, k到x, y, z的期望次数,那么初始状态就有了
d p x , y , z dp_x,_y,_z dpx,y,z = 0, 目标状态-> d p 0 , 0 , 0 dp_0,_0,_0 dp0,0,0;
考虑转移,这里的转移要比正推难一点:
我们采用push的递推方法,(For example : dp[i + 1] += d[i]; );
再维护一个f数组 f i , j , k f_i,_j,_k fi,j,k 表示转移到i,j,k的概率, f x , y , z f_x,_y,_z fx,y,z = 1;
然后,有 f i , j , k f_i,_j,_k fi,j,k ∗ * i i + j + k \frac{i}{i + j + k} i+j+ki的概率转移到 d p i − 1 , j , k dp_i -1,_j,_k dpi1,j,k
f i , j , k f_i,_j,_k fi,j,k ∗ * j i + j + k \frac{j}{i + j + k} i+j+kj的概率转移到 d p i + 1 , j − 1 , k dp_i +1 ,_ j-1,_k dpi+1,j1,k
f i , j , k f_i,_j,_k fi,j,k ∗ * k i + j + k \frac{k}{i + j + k} i+j+kk的概率转移到 d p i , j + 1 , k − 1 dp_i,_j+1,_k-1 dpi,j+1,k1
贡献到i - 1, j, k的期望次数是(n / (i + j + k) ∗ * P( ξ \xi ξ));
其中 ξ \xi ξ是从x, y, z转移到i - 1, j, k的事件, 所以P( ξ \xi ξ)= f i , j , k f_i,_j,_k fi,j,k ∗ * i / (i + j +k );
贡献的期望值是 d p i , j , k dp_i,_j,_k dpi,j,k ∗ * i/(i+j+k);
所以 d p i − 1 , j , k dp_i - 1,_j,_k dpi1,j,k=(n / (i + j + k) ∗ * f i , j , k f_i,_j,_k fi,j,k ∗ * i / (i + j +k )) + d p i , j , k dp_i,_j,_k dpi,j,k ∗ * i/(i+j+k);
d p i + 1 , j − 1 , k dp_i +1 ,_ j-1,_k dpi+1,j1,k, d p i , j + 1 , k − 1 dp_i,_j+1,_k-1 dpi,j+1,k1不难类推,详情如下。

				long double E = (double)1.0L * n / (i + j + k);
				long double G = dp[i][j][k] / f[i][j][k];
				if (i >= 1) {
					f[i - 1][j][k] += f[i][j][k] * i / (i + j + k);
					dp[i - 1][j][k] += (G + E) * f[i][j][k] * i / (i + j + k); 
				} 
				if(j >= 1) {
					f[i + 1][j - 1][k] += f[i][j][k] * j / (i + j + k);
					dp[i + 1][j - 1][k] += (G + E) * f[i][j][k] * j / (i + j + k);
				}
				if (k >= 1) {
					f[i][j + 1][k - 1] += f[i][j][k] * k / (i + j + k);
					dp[i][j + 1][k - 1] += (G + E) * f[i][j][k] * k / (i + j + k); 
				}

如果代码实现有问题请私信或留言 😃;
B y e    Bye~~\it Bye  ~~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值