bzoj#2958. 序列染色

bzoj #2958

  • 非常好的容斥 dp 题

  • 发现这道题分为没有找到颜色 B ,找到连续 K 个颜色 B 但没找到颜色 W 以及都找到了三种状态,因此我们考虑把这些状态记为 0,1,2 设到 dp 中

    • 设计状态:设 dpi,j,k 表示前 i 个数,状态为 j,第 i 个数为 k 的方案数( 0B1W )

    • 转移:首先我们容易想到枚举第 i1 个数填什么,即

      dpi,j,k=dpi1,j,0+dpi1,j,1

      但这显然不对,因为这时候可能出现状态之间的跨越,例如在填第 0 中状态时恰好填了连续 kB,从而转移到状态 1。怎么办?我们考虑使用容斥。

      对于 dpi,0,k,我们先枚举第 i1 位填什么,然后考虑使用容斥减掉出现了连续个颜色 k 的部分,容易发现即为 dpiK,0,k1。对于其他状态同理,最终得到递推式:

      (1)dpi,j,k=dpi1,j,0+dpi1,j,1(2)dpi,0,k=dpiK,0,k1(3)dpi,1,k+=dpiK,0,k1(4)dpi,1,k=dpiK,1,k1(5)dpi,2,k+=dpiK,1,k1

      其中要注意的是对于第 2,3 的式子当且仅当 (iK,i] 中所有数都为 B 时才满足条件,4,5 式子同理,可以使用前缀和来判断区间中是否有某个颜色

    • 最终答案:dpn,2,0+dpn,2,1

  • 最终复杂度 O(n)

posted @   FOX_konata  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
点击右上角即可分享
微信分享提示