首先我们设置 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∑​pi​Xi​
那么我们考虑在这个状态后面接上一个 " r e d " "red" "red"串,也就是第一种操作,这里面的串的概率和贡献会如何变化呢?
对于上述的一个状态 p i X i p_iX_i pi​Xi​,加上一个 " 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∑​3pi​Xi​​+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]相关推荐

  1. luogu P4745 [CERC2017]Gambling Guide(期望DP + 最短路实现)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 P4745 [CERC2017]Gambling Guide(期望DP + 最短路实现) Weblin ...

  2. [SCOI2008]奖励关(期望dp)

    你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出k次宝物,每次你都可以选择吃或者不吃(必须在抛出下一个宝物之前做出选择,且现在决定不吃的宝物以后也不能再吃). 宝 ...

  3. 【bzoj4318】OSU! 期望dp

    题目描述 osu 是一款群众喜闻乐见的休闲软件.  我们可以把osu的规则简化与改编成以下的样子:  一共有n次操作,每次操作只有成功与失败之分,成功对应1,失败对应0,n次操作对应为1个长度为n的0 ...

  4. 【loj6342】跳一跳 期望dp

    题目描述 一个人从 $1$ 开始向 $n$ 跳,在 $i$ 时会等概率跳到 $i,i+1,...,n$ 之一.求从 $1$ 跳到 $n$ 的期望步数. $n\le 10^7$ . 题解 期望dp傻逼题 ...

  5. 【高斯消元】兼 【期望dp】例题

    [总览] 高斯消元基本思想是将方程式的系数和常数化为矩阵,通过将矩阵通过行变换成为阶梯状(三角形),然后从小往上逐一求解. 如:$3X_1 + 2X_2 + 1X_3 = 3$ $           ...

  6. Luogu P3251 [JLOI2012]时间流逝 期望dp

    题面 题面 题解 期望\(dp\)好题! 今年\(ZJOI\)有讲过这题... 首先因为\(T\)只有\(50\),大力\(dfs\)后发现,可能的状态数最多只有\(20w\)左右,所以我们就可以大力 ...

  7. 【bzoj5197】[CERC2017]Gambling Guide 期望dp+堆优化Dijkstra

    题目描述 给定一张n个点,m条双向边的无向图. 你要从1号点走到n号点.当你位于x点时,你需要花1元钱,等概率随机地买到与x相邻的一个点的票,只有通过票才能走到其它点. 每当完成一次交易时,你可以选择 ...

  8. 【BZOJ】1076 [SCOI2008]奖励关 期望DP+状压DP

    [题意]n种宝物,k关游戏,每关游戏给出一种宝物,可捡可不捡.每种宝物有一个价值(有负数).每个宝物有前提宝物列表,必须在前面的关卡取得列表宝物才能捡起这个宝物,求期望收益.k<=100,n&l ...

  9. string (KMP+期望DP)

    Time Limit: 1000 ms   Memory Limit: 256 MB Description  给定一个由且仅由字符 'H' , 'T' 构成的字符串$S$. 给定一个最初为空的字符串 ...

最新文章

  1. Android Studio一直build、一直refreshing、一直buiding gradle project into的终极解决办法...
  2. java stack empty_java.util.Stack.empty()方法实例
  3. 我逛了一下JDK一条街,发现了不少好东西!
  4. 1.1 什么是Hive
  5. 数据集转换_为什么LSTM看起来那么复杂,以及如何避免时序数据的处理差异和混乱...
  6. Lambda表达式(多线程实现)
  7. numpy.arange语法,作用以及举例
  8. 7-277 单身狗 (25 分)
  9. 要啥网·商信:一款让所有商业活动一步跨入移动互联时代的APP
  10. 添加的oracle语句,Oracle中Insert语句的总结
  11. 关于如何提高代码可测试性的一些看法
  12. php 跨天 时间差 秒,判断时间是否在预设跨天时段
  13. iOS 使用FMDB进行数据库操作
  14. excel批量插入图片url显示方法
  15. 机器学习-基础知识、sklearn库、评估指标、python数据处理库
  16. 什么是ipo表,ipo图,hipo图
  17. 马来西亚PHP项目_PHP大马的简单解密
  18. wangEditor 富文本框
  19. windows+7+32位java_深度技术windows7 32位专业版下载
  20. Linux 定时器 setitimer

热门文章

  1. 微信小程序使用less、scss方法
  2. not found for signing config ‘debug‘Android中meta-data的作用xmlns:tools=“http://schemas.android.com/
  3. 还在人工巡检?变电站远程监测,轻松实现
  4. 【python量化】用Python获取基金历史净值数据
  5. 论文翻译-Text Recognition in the Wild: A Survey
  6. 初探测量导致波函数的坍缩不是意识的参与而是信息的作用
  7. C语言基础之10:数组和指针
  8. 练习MySQL,sql练习(mysql版)
  9. 计算变量中置位的bit数
  10. 数据库原理概论第一章思维导图