穿越万年的轮回[期望dp]
首先我们设置 d p i , 0 / 1 , 0 / 1 dp_{i,0/1,0/1} dpi,0/1,0/1表示经过 i i i次操作之后开头为 r e d / e d r red/edr red/edr,结尾为 r e d / e d r red/edr red/edr的串的期望 r e d red red字符串个数。
然后我们考虑转移:
首先我们要来思考一下期望的本质,这样一个状态,我们以 d p i , 0 , 0 dp_{i,0,0} dpi,0,0为例,里面可能有很多种情况,比如串 " r e d r e d " "redred" "redred"和串 " r e d e d r r e d " "rededrred" "rededrred"每一种有一个概率和贡献,假设有 n n n种情况,每一种的概率是 p i p_i pi,贡献是 X i X_i Xi,那么
d p i , 0 , 0 = ∑ i = 1 p i X i dp_{i,0,0}=\sum_{i=1}p_iX_i dpi,0,0=i=1∑piXi
那么我们考虑在这个状态后面接上一个 " r e d " "red" "red"串,也就是第一种操作,这里面的串的概率和贡献会如何变化呢?
对于上述的一个状态 p i X i p_iX_i piXi,加上一个 " r e d " "red" "red"串之后贡献 X i X_i Xi变为 X i + 1 X_i+1 Xi+1,概率 P i P_i Pi变为 P i 3 \frac{P_i}{3} 3Pi所以这样一种转移让
d p i + 1 , 0 , 0 + = ∑ i = 1 p i 3 ( X i + 1 ) = ∑ i = 1 p i X i 3 + ∑ i = 1 p i 3 dp_{i+1,0,0}+=\sum_{i=1}\frac{p_i} {3} (X_i+1)=\sum_{i=1}\frac{p_iX_i} {3}+\sum_{i=1}\frac{p_i} {3} dpi+1,0,0+=i=1∑3pi(Xi+1)=i=1∑3piXi+i=1∑3pi
所以我们再记录一个 p i , 0 / 1 , 0 / 1 p_{i,0/1,0/1} pi,0/1,0/1表示经过 i i i次操作之后开头为 r e d / e d r red/edr red/edr,结尾为 r e d / e d r red/edr red/edr的串的概率,即可转移。
第二种操作和第三种操作同理可以得到:
对于四种情况各自分类讨论即可。但值得注意的是空串不在我们的考虑范围内,得提出来单独计算。
#include<bits/stdc++.h>
using namespace std;typedef long long ll;
const int mod=1e9+7;
ll poww(ll a,ll b){ll t=1;while(b){if(b&1)t=t*a%mod;a=a*a%mod;b>>=1;}return t;
}
void add(int &a,int b){a+=b;if(a>=mod)a-=mod;
}
void del(int &a,int b){a-=b;if(a<0)a+=mod;
}
const int M=2e5+50;
int dp[M][2][2];
int P[M][2][2];int main()
{int k;scanf("%d",&k);//P[0][0][0]=1;int inv3=poww(3,mod-2);int P0=1;for(int i=0;i<k;i++){//printf("%d %d %d %d\n",P[i][0][0],P[i][0][1],P[i][1][0],P[i][1][1]);{add(dp[i+1][0][0],1ll*P0*inv3%mod);add(P[i+1][0][0],1ll*P0*inv3%mod);if(i>=1){add(dp[i+1][1][0],1ll*inv3*P0%mod);add(P[i+1][1][0],1ll*P0*inv3%mod);add(dp[i+1][1][1],1ll*inv3*P0%mod);add(P[i+1][1][1],1ll*P0*inv3%mod);add(dp[i+1][1][1],1ll*9*inv3%mod*P0%mod);add(P[i+1][1][1],1ll*P0*inv3%mod);}P0=1ll*P0*inv3%mod;}// red...redadd(dp[i+1][0][0],((1ll*dp[i][0][0]*inv3%mod)+1ll*P[i][0][0]*inv3%mod)%mod);add(P[i+1][0][0],1ll*P[i][0][0]*inv3%mod);add(dp[i+1][0][1],1ll*dp[i][0][0]%mod*inv3%mod);add(P[i+1][0][1],1ll*P[i][0][0]*inv3%mod);add(dp[i+1][0][0],10ll*dp[i][0][0]%mod*inv3%mod);add(P[i+1][0][0],1ll*P[i][0][0]*inv3%mod);// red..edr dp[0][1]add(dp[i+1][0][0],((1ll*dp[i][0][1]*inv3%mod)+1ll*P[i][0][1]*inv3%mod)%mod);add(P[i+1][0][0],1ll*P[i][0][1]*inv3%mod);add(dp[i+1][0][1],((1ll*dp[i][0][1]*inv3%mod)+1ll*P[i][0][1]*inv3%mod)%mod);add(P[i+1][0][1],1ll*P[i][0][1]*inv3%mod);add(dp[i+1][0][1],(1ll*(10ll*dp[i][0][1])%mod*inv3%mod));add(P[i+1][0][1],1ll*P[i][0][1]*inv3%mod);// edr red dp[1][0]add(dp[i+1][1][0],((1ll*dp[i][1][0]*inv3%mod)+1ll*P[i][1][0]*inv3%mod)%mod);add(P[i+1][1][0],1ll*P[i][1][0]*inv3%mod);add(dp[i+1][1][1],1ll*(dp[i][1][0])*inv3%mod);add(P[i+1][1][1],1ll*P[i][1][0]*inv3%mod);add(dp[i+1][1][0],1ll*(10ll*dp[i][1][0])%mod*inv3%mod);add(P[i+1][1][0],1ll*P[i][1][0]*inv3%mod);// edr edr dp[1][1]add(dp[i+1][1][0],((1ll*dp[i][1][1]*inv3%mod)+1ll*P[i][1][1]*inv3%mod)%mod);add(P[i+1][1][0],1ll*P[i][1][1]*inv3%mod);add(dp[i+1][1][1],((1ll*dp[i][1][1]*inv3%mod)+1ll*P[i][1][1]*inv3%mod)%mod);add(P[i+1][1][1],1ll*P[i][1][1]*inv3%mod);add(dp[i+1][1][1],((10ll*dp[i][1][1]%mod*inv3%mod)+9ll*P[i][1][1]%mod*inv3%mod)%mod);add(P[i+1][1][1],1ll*P[i][1][1]*inv3%mod);}int ans=0;add(ans,dp[k][0][0]);add(ans,dp[k][0][1]);add(ans,dp[k][1][0]);add(ans,dp[k][1][1]);printf("%d",ans);return 0;
}
穿越万年的轮回[期望dp]相关推荐
- luogu P4745 [CERC2017]Gambling Guide(期望DP + 最短路实现)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 P4745 [CERC2017]Gambling Guide(期望DP + 最短路实现) Weblin ...
- [SCOI2008]奖励关(期望dp)
你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出k次宝物,每次你都可以选择吃或者不吃(必须在抛出下一个宝物之前做出选择,且现在决定不吃的宝物以后也不能再吃). 宝 ...
- 【bzoj4318】OSU! 期望dp
题目描述 osu 是一款群众喜闻乐见的休闲软件. 我们可以把osu的规则简化与改编成以下的样子: 一共有n次操作,每次操作只有成功与失败之分,成功对应1,失败对应0,n次操作对应为1个长度为n的0 ...
- 【loj6342】跳一跳 期望dp
题目描述 一个人从 $1$ 开始向 $n$ 跳,在 $i$ 时会等概率跳到 $i,i+1,...,n$ 之一.求从 $1$ 跳到 $n$ 的期望步数. $n\le 10^7$ . 题解 期望dp傻逼题 ...
- 【高斯消元】兼 【期望dp】例题
[总览] 高斯消元基本思想是将方程式的系数和常数化为矩阵,通过将矩阵通过行变换成为阶梯状(三角形),然后从小往上逐一求解. 如:$3X_1 + 2X_2 + 1X_3 = 3$ $ ...
- Luogu P3251 [JLOI2012]时间流逝 期望dp
题面 题面 题解 期望\(dp\)好题! 今年\(ZJOI\)有讲过这题... 首先因为\(T\)只有\(50\),大力\(dfs\)后发现,可能的状态数最多只有\(20w\)左右,所以我们就可以大力 ...
- 【bzoj5197】[CERC2017]Gambling Guide 期望dp+堆优化Dijkstra
题目描述 给定一张n个点,m条双向边的无向图. 你要从1号点走到n号点.当你位于x点时,你需要花1元钱,等概率随机地买到与x相邻的一个点的票,只有通过票才能走到其它点. 每当完成一次交易时,你可以选择 ...
- 【BZOJ】1076 [SCOI2008]奖励关 期望DP+状压DP
[题意]n种宝物,k关游戏,每关游戏给出一种宝物,可捡可不捡.每种宝物有一个价值(有负数).每个宝物有前提宝物列表,必须在前面的关卡取得列表宝物才能捡起这个宝物,求期望收益.k<=100,n&l ...
- string (KMP+期望DP)
Time Limit: 1000 ms Memory Limit: 256 MB Description 给定一个由且仅由字符 'H' , 'T' 构成的字符串$S$. 给定一个最初为空的字符串 ...
最新文章
- Android Studio一直build、一直refreshing、一直buiding gradle project into的终极解决办法...
- java stack empty_java.util.Stack.empty()方法实例
- 我逛了一下JDK一条街,发现了不少好东西!
- 1.1 什么是Hive
- 数据集转换_为什么LSTM看起来那么复杂,以及如何避免时序数据的处理差异和混乱...
- Lambda表达式(多线程实现)
- numpy.arange语法,作用以及举例
- 7-277 单身狗 (25 分)
- 要啥网·商信:一款让所有商业活动一步跨入移动互联时代的APP
- 添加的oracle语句,Oracle中Insert语句的总结
- 关于如何提高代码可测试性的一些看法
- php 跨天 时间差 秒,判断时间是否在预设跨天时段
- iOS 使用FMDB进行数据库操作
- excel批量插入图片url显示方法
- 机器学习-基础知识、sklearn库、评估指标、python数据处理库
- 什么是ipo表,ipo图,hipo图
- 马来西亚PHP项目_PHP大马的简单解密
- wangEditor 富文本框
- windows+7+32位java_深度技术windows7 32位专业版下载
- Linux 定时器 setitimer
热门文章
- 微信小程序使用less、scss方法
- not found for signing config ‘debug‘Android中meta-data的作用xmlns:tools=“http://schemas.android.com/
- 还在人工巡检?变电站远程监测,轻松实现
- 【python量化】用Python获取基金历史净值数据
- 论文翻译-Text Recognition in the Wild: A Survey
- 初探测量导致波函数的坍缩不是意识的参与而是信息的作用
- C语言基础之10:数组和指针
- 练习MySQL,sql练习(mysql版)
- 计算变量中置位的bit数
- 数据库原理概论第一章思维导图