题目
问题描述
试题编号: 201312-4
试题名称: 有趣的数
时间限制: 1.0s
内存限制: 256.0MB
问题描述:
问题描述
我们把一个数称为有趣的,当且仅当:
1. 它的数字只包含0, 1, 2, 3,且这四个数字都出现过至少一次。
2. 所有的0都出现在所有的1之前,而所有的2都出现在所有的3之前。
3. 最高位数字不为0。
因此,符合我们定义的最小的有趣的数是2013。除此以外,4位的有趣的数还有两个:2031和2301。
请计算恰好有n位的有趣的数的个数。由于答案可能非常大,只需要输出答案除以1000000007的余数。
输入格式
输入只有一行,包括恰好一个正整数n (4 ≤ n ≤ 1000)。
输出格式
输出只有一行,包括恰好n 位的整数中有趣的数的个数除以1000000007的余数。
样例输入
4
样例输出
3
分析
这道题我自己也没想到这种奇妙的动态规划状态的定义,就是定义6种状态的方法,但是他给的他过于直接了link,神仙也不能直接想出来,所以我在这个算法的基础上,加上自己对这题的理解,还原一下,这道题目的状态是怎么出来的
首先,我们必须要承认一点,就是在n位的数里,所有相同的项都是在一起的,所以,我们就把他们呢划分成4部分的块.包含0123的,就是一种排列,只不过这些块里数量不一定.
所以我们定义状态,就是在这里块的左右顺序是不变的,就如2.3 ,在这个上面添加只能是向左边和右边添加,绝不可能添加2,1,3这样的.之后我们定义的块要是那种一定存在无异议的块的顺序.
首先状态1,就是都是2,这个一定无异议,2是开头的,加数只能往后面加.(所以后面的加数都是往尾部加,除了2可以往头上加)
状态2 2,0这个是存在的.(是状态1后面加0,或者状态2后面加0,或者状态2前面加2)
状态3 2,3这个也是存在的.(状态1后面加3,状态3前面加2)
这个时候就出现了,为什么没有 2,1呢,这个问题在网上也没搜到啥,所以才有了前面的状态定义的严谨,如果这个地方有2,1,那么再后面,不论是2,1,3,0,还是2,1,0,3,都是不对的,所以这项对答案没有贡献,不算它(2,1,加数只能往尾部加,中间不能插)
状态4 2,0,1存在.(状态2后面加1,状态4后面加1,状态4前面加2)
状态5 2,0,3存在(状态2后面加3,状态5后面加3,或者前面加2)
状态6 2,0,1,3存在(answer)(状态4后面加3)
2,0,3,1(状态5后面加1)
或者 状态6后面加上3/1(看是2013还是2031和是状态6的个数),或者状态6前面加2
这样状态就形成了依赖链,而2,1不在依赖链里,算它没有用.
代码不写了,看懂这些就很简单了.