info: { blogIcon: 'https://cdn.luogu.com.cn/upload/usericon/765493.png', blogUser: 'OIerBoy', blogAvatar: 'https://cdn.luogu.com.cn/upload/usericon/765493.png', blogStartDate: '2023-04-22', webpageTitleOnblur: '(o?v?)ノ Hi', webpageTitleOnblurTimeOut: 1000, webpageTitleFocus: '(*′?`*) 欢迎回来!', webpageTitleFocusTimeOut: 1000, webpageIcon: "https://cdn.jsdelivr.net/gh/BNDong/Cnblogs-Theme-SimpleMemory@master/img/webp/blog_logo.webp", { enable: true, // 是否开启日/夜间模式切换按钮 auto: { // 自动切换相关配置 enable: false, // 开启自动切换 dayHour: 5, // 日间模式开始时间,整数型,24小时制 nightHour: 19 // 夜间模式开始时间,整数型,24小时制 } } },

[ARC059F] バイナリハック

2023-09-29

题目

[ARC059F] バイナリハック

难度&重要性(1~10):6

题目来源

luogu

题目算法

(纯)dp

解题思路

一道非常水的 dp 题。

先看数据 \(N\le 5000\),考虑 \(O(n^2)\) dp。

对于题目的三个操作中,我们唯一需要仔细思考的就是对于退格的操作,因为退格操作是不需要去保证退掉的字符 \(0/1\) 的,但需要保证退掉之后剩下的字符是我们想要的。那么我们就需要将 dp 的一维状态设计为可以去处理退格的。

\(f_{i,j}\) 表示当前进行了 \(i\) 次操作,当前已经匹配了 \(j\) 个字符。(这里使用刷表法转移)

那么我们对于输入 \(0/1\) 的操作转移就非常轻松:\(f_{i+1,j+1}\gets f_{i,j}\)

那如何很好的处理退格呢,前面说了不需要去知道被退的字符,那么我们退掉的字符就会有两种可能,而我们 dp 的第二位有保证了前 \(j\) 个字符匹配的,我们就可以直接进行转移了:

\[\begin{cases}f_{i+1,j-1}\gets f_{i,j}\times 2 & (j>0)\\f_{i+1,j-1}\gets f_{i,j} & (j=0)\end{cases} \]

然后这道紫题就通过了。

完成状态

已完成

posted @ 2023-09-29 16:17  OIerBoy  阅读(6)  评论(0编辑  收藏  举报