期望概率DP

BZOJ2201

题面很难找,找了半天才找到一张图。
题目很别致,我们发现,期望DP的题目一般来说都要根据题目所给的东西来定制一种做法?
本题中,那个贡献值的定义是连乘出来的,那么。。。。。如果说要计算贡献,那么就只能用乘法分配率。
对于已经确定下来的一段,我们用一个状态代表一个集合,因为m的值实在是太大了,不可能设计出一种状态;
也就是说这个集合大约是这样的 {
aaaavbdsad
dasdsadasd
dasdsadsad
dasdsaddsd
}
结尾有着相同的段子,这样子就可以了;
然后链状的这题或者说是环状的这题都是基于这个小模型来解决的;
然后我们先假定题目如果叫我们求的是链状的情况,那么每段直接搞嘛,不就结束了;
环状的情况略微复杂一些,这题不能两倍然后断环为链,那么我们考虑一种情况,首尾不相同,这样的话就可以直接乘上n,就解决了;
在列方程的时候如果我们遵照链状的套路去做会出问题的,因为我们虽然能搞定最后一个,但是无法搞定倒数第二段,那么就要列出,[0/1]的一维了。
在这里插入图片描述

选书问题

原题找不到,但是找到了另一个也很难的DP

题面

有n个同学坐成一列,按从前往后的顺序传n本书,第i本数是第i新的,其中第i个同学会从n-i+1本课本中选一本并把剩下的书传给后面的一位同学,第i个同学在挑选课本的时候满足 如下过程:
1.如果只剩一本书,则一定拿走,否则转步骤2;
2.从剩下的数中抽出最新的一本。
3.有a[i]的概率选择这本书并结束选择,1-a[i]个概率将这本书传给后面的同学并回到步骤1。
现在问最后一名同学拿到的数在新旧排名的期望。

考虑一般的算法瓶颈在我们需要记录拿走的书的集合,但如果我们知道最后一位同学拿的书的排名为 x,那么排名在 x 之前的书对 x 产生的贡献只与剩余的本数(因为一个人拿每本书的概率是相同的)有关,排名在 x 之后的同理。
所以我们先枚举最后一位同学拿的书的排名 x,再考虑 DP 概率,记 f[i][j][k]表示前i 个同学拿书时还剩下 j 本书排名小于等于 x,k 本书排名大于 x,可以转移到 f[i+1][j-1][k]或f[i+1][j][k-1],转移系数为第i个同学拿前j-1新的书的概率和拿后k新的书(不能拿第x本),可以O(n2n2)预处理后转移系数做到 O(1)转移,f[n][1][0]就是最后一个同学拿 x 的概率。
时间复杂度 O(n4),期望得分 80 分。

最后我们发现在确定 x,i,j 后,k 的值是可以算出的,所以省去一维状态。
时间复杂度 O(n3),期望得分 100。

贺来的。

总结一下,我们发现这种类型的似乎可以直接用概率来算,那么就算概率,但是正如上面所说的,一般做法我们解决不了这个问题,原因出在DP的集合难以维护,那么我们就不妨多做几次DP,这样能用时间换空间从而解决这个问题。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<cmath>
using namespace std;
int getint() {
   
	int i=0, f=1; char c;
	for(c = getchar();(c <'0'||c>'9') && c !=
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值