CCF-CSP 201312-4 有趣的数
文章目录
问题描述
思路
首先整理一下有趣的数的定义:
1.只包含数字0、1、2和3
2.0、1、2和3各自至少出现一次
3.所有的0都出现在1之前
4.所有的2都出现在3之前
5.最高位数字不为0
上述定义可以看出,有趣数以1或3结尾,以2开始。
遇到这类题容易想到动态规划。(取一个大数的余就有暗示动规的意味)。但是想了很久都没有想到解法,原因是没有考虑设置子目标进行多目标动规。现将答案的思路重新整理如下:
- 定义 S [ n ] S[n] S[n]为恰好n 位的整数中有趣的数的个数。定义 s [ n ] s[n] s[n]为字符串形式的 n n n位有趣的数的实例。 T [ n ] T[n] T[n]为n 位有趣的数的集合。显然有 S [ n ] = ∣ T [ n ] ∣ S[n] = |T[n]| S[n]=∣T[n]∣用 + + +表示数字字符串的拼接。
- 本题与常见的动态规划的差别在于需要用到一些的子目标,与 S [ n ] S[n] S[n]同时动规求解,且多个目标之间的关系我们希望是线性关系。(否则取余就不能在动规过程中进行,这就失去了意义)
- 得出递归公式的过程是不停地分析和拆解目标并建立子目标的过程。
- 寻找 S [ n ] S[n] S[n]与 S [ n − 1 ] S[n-1] S[n−1]的关系。
- 首先 s [ n − 1 ] + 1 ∈ T [ n ] s[n-1] + 1 \in T[n] s[n−1]+1∈T[n] 且 s [ n − 1 ] + 3 ∈ T [ n ] s[n-1] + 3 \in T[n] s[n−1]+3∈T[n]。这样就把 T [ n ] T[n] T[n]中1和3结尾的情况考虑完了。
- 但1和3结尾的情况并未考虑完全。如 20113 ∈ T [ 5 ] 20113 \in T[5] 20113∈T[5],但 2011 ∉ T [ 4 ] 2011 \notin T[4] 2011∈/T[4],故存在一种由0,1,2组成的结构(0,1,2各自至少出现一次,且0在1的前面),在它后面加上3就可以得到有趣数。将这种数定义为 s 012 [ n ] s_{012}[n] s012[n]。同理存在一种由0,2,3组成的数(0,2,3各自至少出现一次,且2在3的前面)在它后面加上3就可以得到有趣数。将这种数定义为 s 023 [ n ] s_{023}[n] s023[n]。这就是前面说的子目标。于是可以得到如下递推式。 S [ n ] = 2 S [ n − 1 ] + S 012 [ n − 1 ] + S 023 [ n − 1 ] S[n] = 2S[n-1] +S_{012}[n-1]+S_{023}[n-1] S[n]=2S[n−1]+S012[n−1]+