题干:

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

解题报告:

首先2^4-1枚举出所有的可能状态,然后分别进行转移。dp[i][j]代表当前有i位,已经使用过的数字对应状态为j时的合法方案数。

注意对于这一思路有两种解决:一个是转移i-1到i这一位的时候是在后面添加数字,另一种是在前面添加数字。对于这一题而言,显然前者比较简单,因为通过题目可以分析得到:最后形成的这个数字的最高位一定是2所以从前往后增加位数的时候就会少讨论很多情况,16个状态不需要全部列举出来。但是如果从后往前的话,也是可以先看dp[i][15]需要哪些状态,再去对那些状态进行转移,但是有个问题就是最后得到的答案可能含有前导零,所以我们需要先处理到dp[n-1],然后再自行累加到ans中,其实也是因为第一位必须是2这个条件。

注意状态的定义,比如是dp[i][3],也就代表必须含有2和3,而,只含有2或者只含有3的方案数 就不应该被统计在内了。也就是说这个状态不能由dp[i-1][2]再末尾添加一个2构成一个方案数,而是只能添加一个3,因为要保证必须含有2和3(所以这里不用乘2)。

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
const int MAX = 2e5 + 5;
const ll mod = 1e9+7;
ll dp[1055][16];
int main()
{int n;cin>>n;dp[1][2] = 1;for(int i = 2; i<=n; i++) {dp[i][15] = (dp[i-1][11]+dp[i-1][14]+2*dp[i-1][15])%mod;dp[i][11] = (dp[i-1][10]+dp[i-1][3]+2*dp[i-1][11])%mod;dp[i][14] = (dp[i-1][12]+dp[i-1][10]+2*dp[i-1][14])%mod;dp[i][10] = (dp[i-1][2] + 2*dp[i-1][10])%mod;dp[i][12] = (dp[i-1][12]+2*dp[i-1][8]+dp[i-1][4])%mod;dp[i][3] = (dp[i-1][2]+dp[i-1][3])%mod;dp[i][2] = dp[i-1][2];}printf("%lld\n",dp[n][15]);return 0 ;}

【CCFCSP- 201312-4】有趣的数(线性dp)相关推荐

  1. 【CSP201312-4】有趣的数(数位DP)

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

  2. CCF 模拟题 有趣的数 (数位DP)

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

  3. 洛谷 - P1028 数的计算(线性dp)

    题目链接:点击查看 题目大意:现在给出一个自然数n,我们规定三种操作: 不做任何处理 在他左边加上一个自然数,但该数不能超过原数的一半 加上该数后,继续按此规则进行处理,直到不能再加自然数为止 举个例 ...

  4. 0x51.动态规划 - 线性DP(习题详解 × 10)

    目录 0x51.动态规划 - 线性DP 0x51.1 LIS问题 Problem A. 登山 (最长下降子序列) Problem B. 友好城市(思维) Problem C. 最大上升子序列和 0x5 ...

  5. 洛谷P2401 不等数列(线性DP)

    本题使用的是线性DP.就是DP数组难以思考,这里我直接给出 dp[i][j]:表示 1 ~ i 这 i 个数 , 其中j 个 " < " 有几种方法 假设我们已经把 n - ...

  6. CodeForces - 456C Boredom(线性dp)

    题目链接:点击查看 题目大意:给出一个由n个数字组成的数列,现在给出规则是,每次选择数列中的一种数字 x,选择后的贡献为 x,不过操作后会删除掉所有数值为 x + 1 和 x - 1 的数,现在问如何 ...

  7. 动态规划 —— 线性 DP

    [概述] 线性动态规划,是较常见的一类动态规划问题,其是在线性结构上进行状态转移,这类问题不像背包问题.区间DP等有固定的模板. 线性动态规划的目标函数为特定变量的线性函数,约束是这些变量的线性不等式 ...

  8. 动态规划——有趣的数(ccf)

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

  9. CCF CSP201312-4有趣的数

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

最新文章

  1. fork() || fork() || fork() 与 fork() fork() fork()
  2. spring boot 拦截器获取controller返回的数据_高级码农Spring Boot实战与进阶之过滤器和拦截器的使用及其区别...
  3. 华为云服务器 大文件,云服务器上传大文件
  4. Java中性能优化的35种方法汇总
  5. DataTable的Ajax使用
  6. 200(强缓存)和304(协商缓存)的区别
  7. 武汉科技大学计算机研究生拟录取名单,武汉科技大学2021年硕士研究生拟录取名单公示...
  8. Oracle Comment 获取并修改表或字段注释
  9. mysql创建表失败
  10. Spring Data JPA
  11. SwiftyJSON源码分析
  12. 页面中的icon小图标,下载+设置
  13. IC/FPGA系统设计的速度和面积优化
  14. Unity技术手册 - 生命周期内速度限制(Limit Velocity Over Lifetime)子模块和速度继承(Inherit Velocity)子模块
  15. 教你制作第一个C++游戏!#1 引入
  16. OpenGL照相机模型与增强现实
  17. 家谱只能记家族好事吗?家丑不可外扬,后人读谱一脸懵?
  18. 浙江杭州一男子网恋1年求见面, 开门一看这美女长得像“李逵”
  19. C#API说明【Write函数】[汉字转拼音]
  20. ajax请求数据成功但是success中拿不到数据。

热门文章

  1. js 中转换成list集合_程序员:java集合介绍-List,具说很详细,你不来看看?
  2. 什么是ie浏览器_?IE 浏览器为什么不招人待见?
  3. vue(el-button的五种类型,三种css格式)
  4. 街上第一台电子计算机是,南京信息工程大学滨江学院2009级《计算机基础》(文科)a试卷(含答案)【最新】.doc...
  5. vuex的命名空间有哪些_Vue 3 带来的 Vuex 的替代方案
  6. linux桌面旋转了180度,[多图]回顾每一款默认Ubuntu壁纸
  7. threejs骨架形状
  8. mysql视图表修复_mysql中含有视图数据库在恢复数据时视图变成数据表的解决方法...
  9. ubuntu14.04 开启root登陆
  10. asterisk1.8启动信息分析(未完)