问题描述:

试题编号: 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

题目大意:

解题思路:

附录:

(审题过程)

读题后10min之内一度以为是不是题目不严谨,n位是不是都是一样的,比如1个0,2个1,2个2,1个3组成多少种有趣数?再一想不对,应该是用递归的角度来思考,n位的话,遍历第一位是什么,第二位什么......即可以混合。

递归所求(题目答案)为全集,而无数种相同n位有趣数为字集

(写代码过程)

第一次运行

 1 //dfs(x){for(0 n)for(0 4)}
2 //
3 //dfs(x, n)
4 //
5 //fx(x)for(0 n)for(0 4)
6 //纸
7 //养成好习惯,先想再码
8 #include<cstdio>
9 int n;
10 void dfs(bool canbe_1, bool canbe_3, int No);//No表示该在哪个位置填入数字,从0开始
11 char number[1050];
12 char box[4] = {0, 1, 2, 3};//填入什么数字从这四个中选
13 int answer;
14 int main()
15 {
16 scanf("%d", &n);
17 dfs(0, 0, 0);
18 // printf("%d%1000000007", answer);
19 printf("%d", answer);
20 }
21 void dfs(bool canbe___1, bool canbe___3, int No)
22 {
23 if(No == n + 1){
24 answer ++;
25 return;
26 }
27 for(int i = 0; i < 4; i ++)
28 {
29 // if()//这里是先判断No还是先判断i
30 if(i == 0){
31 if(No == 0)
32 continue;
33 else{
34 number[No] = box[i];
35 canbe___1 = 1;
36 dfs(canbe___1, canbe___3, No ++);
37 }
38 }
39 else if(i == 1){
40 if(!canbe___1)
41 continue;
42 else{
43 number[No] = box[i];
44 dfs(canbe___1, canbe___3, No ++);
45 }
46 }
47 else if(i == 2){
48 number[No] = box[i];
49 canbe___3 = 1;
50 dfs(canbe___1, canbe___3, No ++);
51 }
52 else if(i == 3){
53 if(!canbe___3)
54 continue;
55 else{
56 number[No] = box[i];
57 dfs(canbe___1, canbe___3, No ++);
58 }
59 }
60 }
61 }
62
63 //No. !=0
64 //0 1
65 //2 3
66 //
67 //2013
68 //2031
69 //2301
70 //
71 //0 0123
72 //1 0123
73 //2 0123
74 //3 0123

第二次运行

 1 #include<cstdio>
2 int n;
3 void dfs(bool canbe_1, bool canbe_3, int No);//No表示该在哪个位置填入数字,从0开始
4 char number[1050];
5 char box[4] = {0, 1, 2, 3};//填入什么数字从这四个中选
6 int answer;
7 int main()
8 {
9 scanf("%d", &n);
10 dfs(0, 0, 0);
11 printf("%d", answer);
12 }
13 void dfs(bool canbe___1, bool canbe___3, int No)
14 {
15 if(No == n){
16 answer ++;
17 return;
18 }
19 for(int i = 0; i < 4; i ++){
20 // if()//这里是先判断No还是先判断i
21 if(i == 0){
22 if(No == 0)
23 continue;
24 else{
25 number[No] = box[i];
26 canbe___1 = 1;
27 dfs(canbe___1, canbe___3, No ++);
28 }
29 }
30 else if(i == 1){
31 if(!canbe___1)
32 continue;
33 else{
34 number[No] = box[i];
35 dfs(canbe___1, canbe___3, No ++);
36 }
37 }
38 else if(i == 2){
39 printf("##");
40 number[No] = box[i];
41 canbe___3 = 1;
42 dfs(canbe___1, canbe___3, No ++);
43 }
44 else if(i == 3){
45 if(!canbe___3)
46 continue;
47 else{
48 number[No] = box[i];
49 dfs(canbe___1, canbe___3, No ++);
50 }
51 }
52 }
53 }
54
55 //0 1
56 //2 3
57
58 //2013
59 //2031
60 //2301
61
62 dfs 011
63 2
64 20
65 dfs 112
66 200
67
68 //这四个数字都出现过至少一次
69 20133//先0123再重复
70 20013//直接前四位中就有重复
71
72 //卡住了。“这四个数字都出现过至少一次”,不知道怎么写。
73
74 2 _ _ _ _ _
75 3
76 //排列组合?

数位DP,

我以为0出现过就可以出现1呢。即010可以,其实错误。

(扩展)

没太搞明白,时间,内存限制,打acm装逼时只知道1s是10^7左右 当代计算机1s计算达百万次

 

CCF 有趣的数的更多相关文章

  1. CCF软考---《有趣的数》

    脑子一热报了CCF的软测..但是又觉得好像并没有什么卵用,就当为蓝桥杯预热然后顺便去软件学院玩一玩吧,遇到一个有意思的题: time limits : 1s 问题描述 我们把一个数称为有趣的,当且仅当 ...

  2. CCF CSP 201312-4 有趣的数

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201312-4 有趣的数 问题描述 我们把一个数称为有趣的,当且仅当: 1. 它的数字只包含0 ...

  3. CCF 201312-4 有趣的数 (数位DP, 状压DP, 组合数学+暴力枚举, 推公式, 矩阵快速幂)

    问题描述 我们把一个数称为有趣的,当且仅当: 1. 它的数字只包含0, 1, 2, 3,且这四个数字都出现过至少一次. 2. 所有的0都出现在所有的1之前,而所有的2都出现在所有的3之前. 3. 最高 ...

  4. CCF系列之有趣的数(201312-4)

    题目链接: http://115.28.138.223:81/view.page?opid=4 试题名称: 有趣的数 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 我们把一个 ...

  5. ccf 201312-04 有趣的数(组合数学)

    问题描述 我们把一个数称为有趣的,当且仅当: 1. 它的数字只包含0, 1, 2, 3,且这四个数字都出现过至少一次. 2. 所有的0都出现在所有的1之前,而所有的2都出现在所有的3之前. 3. 最高 ...

  6. CCF 201312-4 有趣的数[dp][难]

    问题描述 试题编号: 201312-4 试题名称: 有趣的数 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 我们把一个数称为有趣的,当且仅当: 1. 它的数字只包含0, 1, ...

  7. CCF模拟题 有趣的数

    有趣的数 时间限制: 1.0s 内存限制: 256.0MB   问题描述 我们把一个数称为有趣的,当且仅当: 1. 它的数字只包含0, 1, 2, 3,且这四个数字都出现过至少一次. 2. 所有的0都 ...

  8. nyoj 85 有趣的数

    点击打开链接 有趣的数 时间限制:3000 ms  |  内存限制:65535 KB 难度: 描述 把分数按下面的办法排成一个数表. 1/1 1/2 1/3 1/4..... 2/1 2/2 2/3. ...

  9. P2022 有趣的数

    P2022 有趣的数 题目描述 让我们来考虑1到N的正整数集合.让我们把集合中的元素按照字典序排列,例如当N=11时,其顺序应该为:1,10,11,2,3,4,5,6,7,8,9. 定义K在N个数中的 ...

  10. CSP201312-4 有趣的数【dp】

    问题描述 试题编号: 201312-4 试题名称: 有趣的数 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 我们把一个数称为有趣的,当且仅当: 1. 它的数字只包含0, 1, ...

随机推荐

  1. ajax跨域(跨源)方案之CORS

    ajax跨域(跨源)方案:后端授权[CORS],jsonp,服务端代理 CORS是一个W3C标准,全称是"跨域资源共享",它允许浏览器向跨源的后端服务器发出ajax请求,从而克服了 ...

  2. 记一次 .NET某工控WPF程序被人恶搞的 卡死分析

    一:背景 1. 讲故事 这一期程序故障除了做原理分析,还顺带吐槽一下,熟悉我的朋友都知道我分析dump是免费的,但免费不代表可以滥用我的宝贵时间,我不知道有些人故意恶搞卡死是想干嘛,不得而知,希望后面 ...

  3. MySQL学习笔记-数据操作语言

    SQL-数据操作语言(DML) 数据操作语言,用于对数据库中表的数据记录进行增删改的操作 一.添加数据(insert) 1. 给指定字段添加数据 insert into {表名} ({字段1},{字段 ...

  4. 使用vscode编辑c语言

    在 Visual Studio Code (VSCode) 中配置 C 语言环境 步骤指南: 一,前期准备(安装扩展,软件包) 安装 C/C++ 扩展 打开 VSCode. 点击左侧边栏的扩展按钮(或 ...

  5. fs.1.10 ON rockylinux8 docker镜像制作

    概述 freeswitch是一款简单好用的VOIP开源软交换平台. rockylinux docker上编译安装fs1.10版本的流程记录. 环境 docker engine:Version 24.0 ...

  6. kettle从入门到精通 第六十课 ETL之kettle for循环处理每条数据,so easy!

    1.kettle原生是支持for循环处理的,无需通过javascript脚本或者java脚本开发for循环控制.当然如果想通过脚本挑战下也是可以的. 本节课主要讲解如何通过kettle中的job来实现 ...

  7. SQL server查看触发器是否被禁用

    1 select a.name as 触发器名,b.name as 表名, 2 case a.is_disabled when 0 then '启用' when 1 then '禁用' else '未 ...

  8. Mysql性能优化(详解)

    引言 今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情.当我们去设计数据库表结构,对操 ...

  9. 实战分析Java的异步编程,并通过CompletableFuture进行高效调优

    一.写在开头 在我们一开始讲多线程的时候,提到过异步与同步的概念,这里面我们再回顾一下: 同步:调用方在调用某个方法后,等待被调用方返回结果:调用方在取得被调用方的返回值后,再继续运行.调用方顺序执行 ...

  10. 在线RSA签名工具

    在线RSA签名工具支持多种RSA签名算法,包括RSA-MD5.RSA-SHA1.RSA-SHA224.RSA-SHA256.RSA-SHA384和RSA-SHA512.用户只需上传需要签名的数据和私钥 ...