有趣的数

CCF模拟题 有趣的数
问题描述

我们把一个数称为有趣的,当且仅当:

  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

思路为DP 每一次决策都基于前一次决策的最优解即n位数的解基于n-1
位数的最优解。
我们对一个数的第n位
根据 规则 共有以下几种状态
0 --用了2,剩 0 ,1, 3
1 -- 用了 0 ,2 剩下 1,3
2 -- 用了 2 3 剩下 0,1
3 -- 用了 0 1 2 剩下3
4 -- 用了 0 2 3 剩下1
5 全用

然后呢我们需要让用户输入位数,然后声明同等位数的数组,在每个元素里
是6种状态中所包含状态下的“符合条件数”的个数。(是二维数组)
然后用动态规划思想从最小位数逐层向上计算。
例:对于在i位状态5的计算,考虑在i-1位时 有三种状态可以到达
状态5, 状态3 i位填 3 状态4 i位填1 和状态5 填1或3;

所以定义好状态之后 根据i位和i-1位的关系 得出以下关系然后for训练动态规划递推即可
j=i-1;

si=1;
si=sj +sj*2
si= sj+sj;
si =sj +sj*2
si =sj+sj+sj*2
si =sj+sj+sj*2
逻辑关系如上~ 当然写关系式的时候容易出错~ 请仔细检查逻辑正确与否~

你可能感兴趣的:(c++)