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

#include <iostream>
#include <cstring>
using namespace std;
typedef long long ll;
ll dp[22][22][3];
int dig[20];
ll dfs(int len , int count , int temp , int flag , int first) {
if(len == 0) {
if(temp == 1) {
if(count % 2 != 0) {
return 1;
}
else {
return 0;
}
}
if(temp == 2) {
if(count % 2 == 0) {
return 1;
}
else {
return 0;
}
}
return 0;
}
if(!flag && !first && dp[len][count][temp] != -1) {
return dp[len][count][temp];
}
int n = flag ? dig[len] : 9;
ll sum = 0;
for(int i = 0 ; i <= n ; i++) {
if(first) {
if(i == 0) {
sum += dfs(len - 1 , 0 , 0 , flag && i == n , first && i == 0);
}
else {
if(i % 2 == 0) {
sum += dfs(len - 1 , count + 1 , 1 , flag && i == n , first && i == 0);
}
else {
sum += dfs(len - 1 , count + 1 , 2 , flag && i == n , first && i == 0);
}
}
}
else {
if(i % 2 == 0) {
if(temp == 1) {
sum += dfs(len - 1 , count + 1 , 1 , flag && i == n , first && i == 0);
}
if(temp == 2) {
if(count % 2 == 0) {
sum += dfs(len - 1 , 1 , 1 , flag && i == n , first && i == 0);
}
}
}
else {
if(temp == 1) {
if(count % 2 != 0) {
sum += dfs(len - 1 , 1 , 2 , flag && i == n , first && i == 0);
}
}
if(temp == 2) {
sum += dfs(len - 1 , count + 1 , 2 , flag && i == n , first && i == 0);
}
}
}
}
if(!flag && !first) {
dp[len][count][temp] = sum;
}
return sum;
}
ll Get(ll x) {
int len = 0;
memset(dp , -1 , sizeof(dp));
memset(dig , 0 , sizeof(dig));
if(x == 0)
len = 1;
while(x) {
dig[++len] = x % 10;
x /= 10;
}
return dfs(len , 0 , 0 , 1 , 1);
}
int main()
{
int t;
cin >> t;
int ans = 0;
while(t--) {
ans++;
ll l , r , gg;
cin >> l >> r;
cout << "Case #" << ans << ": " << Get(r) - Get(l - 1) << endl;
}
return 0;
}

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. OI/ACM最全卡常大招

    NO.10: 循环展开: 在缓存和寄存器允许的情况下一条语句内大量的展开运算会刺激 CPU 并发(蛤?这是个什么原理,算了,反正写了没坏处就这么写吧) NO.9: 特殊运算优化:(或许这真的没用) 取 ...

  2. 前端工程师和设计师必备的chrome插件

    Google Chrome是最好用的几个浏览器之一,今天我来分享下自己收集的一系列Chrome插件,希望对大家的学习和工作有帮助. 注:你可以通过复制链接或者在谷歌商店搜索相应插件的名称来获取以下插件 ...

  3. mysql5.7.18-winx64安装

    win10下装mysql-5.7.18-winx64 步骤1 官网下载地址:https://dev.mysql.com/downloads/mysql/ 选择手动安装版: 解压到D盘mysql文件夹下 ...

  4. 夯实Java基础(五)——==与equals()

    1.前言 我们在学习Java的时候,看到==.equals()就认为比较简单,随便看了一眼就过了,其实你并没有深入去了解二者的区别.这个问题在面试的时候出现的频率比较高,而且据统计有85%的人理直气壮 ...

  5. 【Java例题】4.5异常处理

    5. 对于输入的数,如果出现小数,则作为异常处理,并舍去小数,显示结果:如果输入的数据类型不对也作为异常处理,显示结果0. package chapter4; import java.util.*; ...

  6. 第十五章 LVM管理和ssm存储管理器使用 随堂笔记

    第十五章 LVM管理和ssm存储管理器使用 本节所讲内容: 15.1 LVM的工作原理 15.2 创建LVM的基本步骤 15.3 实战-使用SSM工具为公司的邮件服务器创建可动态扩容的存储池 LVM的 ...

  7. SonarQube系列一、Linux安装与部署

    [前言] 随着项目团队规模日益壮大,项目代码量也越来越多.且不说团队成员编码水平层次不齐,即便是老手,也难免因为代码量的增加和任务的繁重而忽略代码的质量,最终的问题便是bug的增多和代码债务的堆积.因 ...

  8. HomeKit智能球泡

    产品名称: 智能LED灯泡调光调色 接入苹果HomeKit家庭(无需网关).天猫精灵.小爱.小度.Google.ALEXA 产品价格:9.9 本产品是针对HomeKit的产品,没有iphone手机,配 ...

  9. 使用ArrayPool池化大型数组(翻译)

    原文链接:https://adamsitnik.com/Array-Pool/ 使用ArrayPool 简介 .NET的垃圾收集器(GC)实现了许多性能优化,其中之一就是,设定年轻的对象很快消亡,然而 ...

  10. Java内存映射,上G大文件轻松处理

    内存映射文件(Memory-mapped File),指的是将一段虚拟内存逐字节映射于一个文件,使得应用程序处理文件如同访问主内存(但在真正使用到这些数据前却不会消耗物理内存,也不会有读写磁盘的操作) ...