Problem Description

For a number,if the length of continuous odd digits is even and the length of continuous even digits is odd,we call it odd-even number.Now we want to know the amount of odd-even number between L,R(1<=L<=R<= 9*10^18). 
 
Input
First line a t,then t cases.every line contains two integers L and R. 
 
Output
Print the output for each case on one line in the format as shown below.

题意:一个数中所有连续的奇数长度都为偶数,所有连续偶数的长度都为奇数。我们要找一个区间内一共有多少个这样的数。

区间范围(1~9*10^18)所以显然是数位dp搞。设dp[len][count][temp],temp=1表示偶数,temp=2表示奇数,temp=0表示取首位0时,

count表示到len位置有几个奇数或偶数个。显然简单的搜索,标准数位dp

  1. #include <iostream>
  2. #include <cstring>
  3. using namespace std;
  4. typedef long long ll;
  5. ll dp[22][22][3];
  6. int dig[20];
  7. ll dfs(int len , int count , int temp , int flag , int first) {
  8. if(len == 0) {
  9. if(temp == 1) {
  10. if(count % 2 != 0) {
  11. return 1;
  12. }
  13. else {
  14. return 0;
  15. }
  16. }
  17. if(temp == 2) {
  18. if(count % 2 == 0) {
  19. return 1;
  20. }
  21. else {
  22. return 0;
  23. }
  24. }
  25. return 0;
  26. }
  27. if(!flag && !first && dp[len][count][temp] != -1) {
  28. return dp[len][count][temp];
  29. }
  30. int n = flag ? dig[len] : 9;
  31. ll sum = 0;
  32. for(int i = 0 ; i <= n ; i++) {
  33. if(first) {
  34. if(i == 0) {
  35. sum += dfs(len - 1 , 0 , 0 , flag && i == n , first && i == 0);
  36. }
  37. else {
  38. if(i % 2 == 0) {
  39. sum += dfs(len - 1 , count + 1 , 1 , flag && i == n , first && i == 0);
  40. }
  41. else {
  42. sum += dfs(len - 1 , count + 1 , 2 , flag && i == n , first && i == 0);
  43. }
  44. }
  45. }
  46. else {
  47. if(i % 2 == 0) {
  48. if(temp == 1) {
  49. sum += dfs(len - 1 , count + 1 , 1 , flag && i == n , first && i == 0);
  50. }
  51. if(temp == 2) {
  52. if(count % 2 == 0) {
  53. sum += dfs(len - 1 , 1 , 1 , flag && i == n , first && i == 0);
  54. }
  55. }
  56. }
  57. else {
  58. if(temp == 1) {
  59. if(count % 2 != 0) {
  60. sum += dfs(len - 1 , 1 , 2 , flag && i == n , first && i == 0);
  61. }
  62. }
  63. if(temp == 2) {
  64. sum += dfs(len - 1 , count + 1 , 2 , flag && i == n , first && i == 0);
  65. }
  66. }
  67. }
  68. }
  69. if(!flag && !first) {
  70. dp[len][count][temp] = sum;
  71. }
  72. return sum;
  73. }
  74. ll Get(ll x) {
  75. int len = 0;
  76. memset(dp , -1 , sizeof(dp));
  77. memset(dig , 0 , sizeof(dig));
  78. if(x == 0)
  79. len = 1;
  80. while(x) {
  81. dig[++len] = x % 10;
  82. x /= 10;
  83. }
  84. return dfs(len , 0 , 0 , 1 , 1);
  85. }
  86. int main()
  87. {
  88. int t;
  89. cin >> t;
  90. int ans = 0;
  91. while(t--) {
  92. ans++;
  93. ll l , r , gg;
  94. cin >> l >> r;
  95. cout << "Case #" << ans << ": " << Get(r) - Get(l - 1) << endl;
  96. }
  97. return 0;
  98. }

hdu 5898 odd-even number(数位dp)的更多相关文章

  1. 多校5 HDU5787 K-wolf Number 数位DP

    // 多校5 HDU5787 K-wolf Number 数位DP // dp[pos][a][b][c][d][f] 当前在pos,前四个数分别是a b c d // f 用作标记,当现在枚举的数小 ...

  2. hdu 5898 odd-even number 数位DP

    传送门:hdu 5898 odd-even number 思路:数位DP,套着数位DP的模板搞一发就可以了不过要注意前导0的处理,dp[pos][pre][status][ze] pos:当前处理的位 ...

  3. HDU 5898 odd-even number (数位DP) -2016 ICPC沈阳赛区网络赛

    题目链接 题意:一个数字,它每个数位上的奇数都形成偶数长度的段,偶数位都形成奇数长度的段他就是好的.问[L , R]的好数个数. 题解:裸的数位dp, 从高到低考虑每个数位, 状态里存下到当前位为止的 ...

  4. HDU 5787 K-wolf Number 数位DP

    K-wolf Number Problem Description   Alice thinks an integer x is a K-wolf number, if every K adjacen ...

  5. HDU 3709 Balanced Number (数位DP)

    Balanced Number Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) ...

  6. HDU 5179 beautiful number 数位dp

    题目链接: hdu: http://acm.hdu.edu.cn/showproblem.php?pid=5179 bc(中文): http://bestcoder.hdu.edu.cn/contes ...

  7. 2017"百度之星"程序设计大赛 - 复赛1005&&HDU 6148 Valley Numer【数位dp】

    Valley Numer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  8. hdu 4352 XHXJ's LIS 数位dp+状态压缩

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4352 XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others ...

  9. codeforces Hill Number 数位dp

    http://www.codeforces.com/gym/100827/attachments Hill Number Time Limits:  5000 MS   Memory Limits: ...

随机推荐

  1. 【iOS】iOS 调试快速定位程序在哪崩溃

    iOS 开发过程中经常遇到程序崩溃.快速定位程序在哪崩溃的步骤如下: 1. 2. 3. 这样设置后,程序崩溃时会定位到崩溃的语句,如下: 原文链接:iOS开发何如在调试的时候轻松找到程序在哪里崩溃

  2. 多线程编程(Linux C)

    多线程编程可以说每个程序员的基本功,同时也是开发中的难点之一,本文以Linux C为例,讲述了线程的创建及常用的几种线程同步的方式,最后对多线程编程进行了总结与思考并给出代码示例. 一.创建线程 多线 ...

  3. codeforces 347A - Difference Row

    给你一个序列,让你求(x1 - x2) + (x2 - x3) + ... + (xn - 1 - xn).值最大的一个序列,我们化简一下公式就会发现(x1 - x2) + (x2 - x3) + . ...

  4. 开发一个Spring Boot Starter!

    在上一篇文章中,我们已经了解了一个starter实现自动配置的基本流程,在这一小结我们将复现上一过程,实现一个自定义的starter. 先来分析starter的需求: 在项目中添加自定义的starte ...

  5. MyBatis 核心配置综述之 ParameterHandler

    目录 ParameterHandler 简介 ParameterHandler 创建 ParameterHandler 中的参数从何而来 ParameterHandler 解析 MyBatis 四大核 ...

  6. 【Java例题】2.7找零钱

    7.为顾客找零钱时,希望选用的纸币张数最少. 例如73元,希望零钱的面值为五十元1张,二十元1张,一元3张. 设零钱面值有五十元.二十元.十元.五元和一元, 请编写程序,用户输入100以下的数, 计算 ...

  7. Python 四大主流 Web 编程框架

    Python 四大主流 Web 编程框架 目前Python的网络编程框架已经多达几十个,逐个学习它们显然不现实.但这些框架在系统架构和运行环境中有很多共通之处,本文带领读者学习基于Python网络框架 ...

  8. 集成方法 Ensemble

    一.bagging 用于基础模型复杂.容易过拟合的情况,用来减小 variance(比如决策树).基础模型之间没有太多联系(相对于boosting),训练可以并行.但用 bagging 并不能有助于把 ...

  9. Markdown 基本语法(后面继续补充)

    1.1 Markdown 基础语法 有序内容和无序内容 有序内容:输入1.然后按tab键 无序内容:输入' * ' 或 ' - ' 然后后按tab键 字体的样式 *** 内容 *** 加粗加斜(中间没 ...

  10. 如何永久破解IDEA 2019.2

    声明: 支持知识产权,支持正版产权,以下仅限个人学习使用IDEA工具时随笔记录,禁止商业使用. 以下个人提供的激活补丁和激活码来源,均由网上下载,各位也可以自行查找. IDEA官网下载地址:https ...