【计数DP】有趣的数
/ / 点击 / 阅读耗时 4 分钟原题链接
思路
一个直观的想法是,如果我们知道长度为的有趣的数的个数,是否可以知道长度为的有趣的数个数?简单思考,容易发现,如果只知道有趣的数个数,是不足以完成递推的,例如题目中给出的4位有趣的数,并不是所有5位有趣的数的前缀。然而,如果我们可以枚举所有可行前缀的个数 ,就可以完成递推,并且由于前缀是唯一的,故而递推结果不会重复。
哪些前缀是可行的?题目中的约束简单说来,就是第一个数字必须是2,0必须在1之前,2必须在3之后。故而:
- 对于任意前缀,2必然存在其中;
- 只可能缺少1/3/1,3/0,1/0,1,3这些数字组合。
故而,我们可以将前缀分为6种,除了上述的5种缺少数字的组合之外,还应该有全部数字都存在的情况。简单思考,这样的状态是合理的,满足最优子结构。为了讨论的方便起见,我们不妨将6种状态记为:
1 | 0 全有 |
接下来思考状态如何转移。
- 状态0可以通过自身(后缀为1,3)以及1、2两个状态转移(后缀为缺少的数字);
- 状态1可以通过自身(后缀为2,1)以及状态3转移;
- 状态2可以通过自身(后缀为0,3)以及状态3,4转移;
- 状态3可以通过自身(后缀为0,2)以及状态5转移;
- 状态4可以通过自身(后缀为3)以及状态5转移;
- 状态5只可以通过自身转移。
容易发现,上述每一个状态只依赖编号大于等于它的状态,故而可以只使用一个大小为6的数组完成状态转移。
实现
1 |
|
感谢阅读!欢迎评论嗷~