【ybt金牌导航1-2-6】【luogu P2467】地精部落
地精部落
题目链接:ybt金牌导航1-2-6 / luogu P2467
题目大意
有一个排列,要使得每个位置要么都比两边高,要么比两边低。
而且一定要以一高一低的方式排列。
两边的只用比旁边的那个高或低就可以。
给出排列的长度 n 和模数,要你求出排列的种数在模数取模意义下的值。
思路
我们考虑设 为前 个数的排列,最后一个数是高的,然后是 会有的方案数。
那我们可以发现有几个特点:
- 高低高低和低高低高这两种形状的类型种数都是相同的。
因为你可以把 看成 。
那这个既是另一种类型了。 - 如果一个排列已经是满足的了,而且 和 不相邻。那我们可以把他们互换,还是合法的。就因为他们不相邻,那它们就算交换了,它们还是原来的高低状态,就没有问题。
那我们可以求以高结尾的方案数,然后再输出乘 即可。
那怎么求高结尾的呢?
考虑根据上面的特点搞转移方程。
为什么呢?
按相不相邻来分开,不相邻的就可以交换直接形成新的波动,那就是把 和 交换所能有的方案数,就是 。
那我们考虑如果相邻,是怎么样的。
那它就变成了 前 个数的排列, 是最后一个,且是山谷的情况。因为这样你就可以直接让 的区间的数都加一(因为是相对的关系,加了之后还是满足高低关系),然后再在最后的位置把 插进去。
那你由前面可以知道,你前面是山谷,那你要把山谷改成山峰,那第二位就要变成 ,即 。那就可以从 转移过来。
然后你就得到了转移方程。
当然,两个 的数组会炸空间,那我们观察到 这一维只会涉及前面的那一个,那就可以用滚动数组解决空间问题。
代码
__EOF__

本文作者:あおいSakura
本文链接:https://www.cnblogs.com/Sakura-TJH/p/YBT_JPDH_1-2-6.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/Sakura-TJH/p/YBT_JPDH_1-2-6.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
标签:
DP
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现