ccf-csp 201312-4有趣的数

该博客介绍了一种有趣的数的定义,即数字只包含0, 1, 2, 3,0在1前,2在3前,首位不为0。博主通过动态规划分析了如何计算n位有趣的数的个数,并详细解释了状态定义和依赖关系,帮助理解解题思路。" 117412056,8179450,Python+OpenCV:文字分割技术详解,"['计算机视觉', '图像处理', 'Python编程', 'OpenCV应用', '文字识别']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有趣的数

题目

问题描述
试题编号: 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不在依赖链里,算它没有用.
代码不写了,看懂这些就很简单了.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值