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. gulp压缩js文件报错日志

    输出 gulp-uglify 压缩js文件时报错信息 gulp.task('es6', function () { return gulp.src('src/main/webapp/bower_com ...

  2. http://regex.alf.nu/ 非标准答案

    Plain strings (207)                             foo Anchors (206)                                   ...

  3. ElasticSearch6.x版本聚合分析整理

    ElasticSearch6.x版本聚合分析整理 ES将聚合分析主要分为如下4类 Bucket,分桶类型,类似SQL中的GROUP BY语法 Metric,指标分析类型,如计算最大值 , 最小值,平均 ...

  4. 【Java例题】2.1复数类

    1.定义复数类,包括实部和虚部变量.构造方法. 加减乘除方法.求绝对值方法和显示实部.虚部值的方法. 然后编写一个主类,在其主方法中通过定义两个复数对象来 显示每一个复数的实部值.虚部值和绝对值, 显 ...

  5. 把Jar包加入windows系统服务

    之前在服务器上不一个Java服务时候,总是开着一堆黑框框,非常不雅,重点是极其容易误关,所以把可执行Jar文件加入Windows系统服务,看起来是个非常不错的选择!(实际上也确实是非常不错的选择) ! ...

  6. JAVA基础知识(八)值传递与引用传递

    值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响 ...

  7. java虚拟机学习笔记(五)---运行时的数据区域

    Java虚拟机所管理的内存包括以下几个运行时的数据区域:方法区,堆,虚拟机栈,本地方法栈,程序计数器.下面对其进行介绍: 程序计数器 它是一块较小的内存空间,可以看做当前线程做执行的字节码的信号指示器 ...

  8. Scala基础语法学习(一)

    1. val和var的区别 val定义的是一个常量,无法改变其内容 scala> val s = 0 s: Int = 0 scala> s = 2 <console>:12: ...

  9. Mysql 分页order by一个相同字段,发现顺序错乱

    两次分页查询,其中跳过了2个id   select * from jdp_tb_trade  where jdp_modified>='2017-04-24 20:22:01' and jdp_ ...

  10. 《机器学习技法》---GBDT

    1 对决策树使用adaboost 对决策树使用adaboost时,有以下几个问题: (1)adaboost每次更新的样本权重如何应用到决策树中? 由于我们不知道决策树的err目标是什么,因此通常的方法 ...