Ybt#452-序列合并【期望dp】

1|0正题

题目链接:https://www.ybtoj.com.cn/contest/113/problem/2


1|1题目大意

一个空序列,每次往末尾加入一个[1,m]中的随机一个数。如果末尾两个数相同都为x(x<t),那么将它们合并成x+1

如果序列长度为n且无法合并则结束,求序列期望和。

n,m[1,103],t[1,109]


1|2解题思路

首先显然地t=min{n+m1,t}

之后考虑序列中的每一个位置可能的数,因为每种情况都有可能,所以我们需要算概率先,设pi,j表示剩余i个位置时出现j的概率,那么有pi,j=1m×[jm]+pi,j12(直接出现或者合并出来)。

pi,j×qi,j表示剩下i个位置且第一个最终是j的概率,那么有qi,j=1pi1,j×[j<t]qi,j就表示在出现了j的前提下不变的概率,减去会变的概率就好了)。

但是因为每个位置的概率不是独立的,所以不能直接用这个来算答案。

pi,j×gi,j表示在剩下i个位置且第一个最终是j时和的期望和(注意期望=概率*次数),pi,j×fi,j表示剩下i个位置时第一个出现过j的情况的期望和,ansi表示剩下i个位置时的期望和。

那么有

ansi=j=1tpi,j×gi,j

考虑g的递推式有

gi,j=qi,j×j+ansi1pi1,j×fi1,j

(有qi,j的概率最终是j,填完剩下的,且下一个不能出现j
考虑f的递推式有

fi,j=gi,j+(1qi,j)fi,j+1

(第一种是最终不变,第二种是变成了j+1的情况)

这样就可以递推了,时间复杂度O(n2)


1|3code

#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll N=2100,P=1e9+7; ll n,m,t,p[N][N],q[N][N],g[N][N],f[N][N],ans[N]; ll power(ll x,ll b){ ll ans=1; while(b){ if(b&1)ans=ans*x%P; x=x*x%P;b>>=1; } return ans; } signed main() { freopen("sequence.in","r",stdin); freopen("sequence.out","w",stdout); scanf("%lld%lld%lld",&n,&m,&t); ll inv=power(m,P-2); t=min(t,n+m-1); for(ll i=1;i<=n;i++) for(ll j=1;j<=t;j++){ p[i][j]=(inv*(j<=m)+p[i-1][j-1]*p[i][j-1]%P)%P; q[i][j]=(1-(j<t)*p[i-1][j]+P)%P; } for(ll i=1;i<=n;i++){ for(ll j=t;j>=1;j--){ if(j!=t) g[i][j]=(q[i][j]*j%P+ans[i-1]-f[i-1][j]*p[i-1][j]%P+P)%P; else g[i][j]=(q[i][j]*j%P+ans[i-1])%P; f[i][j]=(g[i][j]%P+(1-q[i][j])*f[i][j+1]%P)%P; (ans[i]+=g[i][j]*p[i][j])%=P; } } printf("%lld\n",ans[n]); return 0; }

__EOF__

本文作者QuantAsk
本文链接https://www.cnblogs.com/QuantAsk/p/14402054.html
关于博主:退役OIer,GD划水选手
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   QuantAsk  阅读(69)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示