题意

在l到r区间内求有多少个符合条件“当前数中所有连续的奇数长度是偶数 所有连续的偶数长度是奇数”的个数

分析

典型的数位dp问题
我们设置dp数组时可以根据 dp[pos][pre][len]设定
表示在pos长度下 前面是pre并且长度是len的个数共有多少这个方法很巧妙
根据这个结构 我们dfs(pos,pre,len,zero,limit)这样设置递归参数
我们把所有可能符合条件的分支都去搜索一遍
当我们到pos==0的时候 判断一下 此时如果pre和len的奇偶性不同 那么就返回1 表示这个数字
符合条件
因为当我们递归的时候是把所有可能的尝试都去做了一遍 所以如果当下的数 可能产生正确结果
就根据我们设置的dfs结构递归下去 最终都依靠 pos==0的判断 和之前所做的备忘得到结果
和缩小时间复杂度

code

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int d[20];//1 2 3 4 5 6 7 8 9 10
ll dp[20][20][20];
ll dfs(int pos,int pre,int len,bool zero,bool lim){if(pos==0)return (pre&1)!=(len&1);if(!lim&&~dp[pos][pre][len])return dp[pos][pre][len];ll ans=0;int up = lim==0?9:d[pos];for(int i=0;i<=up;i++){//为了计算得到正确结果 我们尝试把所有可能产生计数的可能都走一遍if(zero){//如果存在前导0 那么可能产生计数的情况是 当前位=0或!=0 都要搜索一遍if(i==0)ans+=dfs(pos-1,0,0,1,i==up&&lim);//当前位为0 那么继续加一位前导0继续搜索else ans+=dfs(pos-1,i,len+1,0,i==up&&lim);//非0 zero=0继续搜索 }else{if(i&1){//如果是奇数if(pre&1)ans+=dfs(pos-1,i,len+1,0,i==up&&lim);//继续搜索else if(len&1)ans+=dfs(pos-1,i,1,0,i==up&&lim);//如果是偶数 长度是也是奇数 那么改变奇偶性 长度为1 继续搜}else{if(!(pre&1))ans+=dfs(pos-1,i,len+1,0,i==up&&lim);//如果上一位偶数 那么长度递增 继续搜else if(!(len&1))ans+=dfs(pos-1,i,1,0,i==up&&lim);//如果上一位是奇数 长度变1继续搜 }}}if(!lim)dp[pos][pre][len]=ans;return ans;
}
ll solve(ll x){int j=0;while(x){d[++j] = x%10;x/=10;}return dfs(j,0,0,1,1);
}
int main()
{int t;ll l,r;scanf("%d",&t);for(int i=1;i<=t;i++){scanf("%lld%lld",&l,&r);printf("Case #%d: ",i);memset(dp,-1,sizeof(dp));printf("%lld\n",solve(r)-solve(l-1));}return 0;
}

HDU odd-even number 数位dp相关推荐

  1. HDU 3709 Balanced Number (数位DP)

    题意 求出[x, y] 范围内的平衡数,平衡数定义为:以数中某个位为轴心,两边的数的偏移量为矩,数位权重,使得整个数平衡. 思路 外层枚举平衡点,然后数位DP即可.设计状态: dp[pos][o][l ...

  2. HDU - 3709 Balanced Number(数位dp)

    题目链接:点击查看 题目大意:将一串数字视为天平,两端平衡的数字称为平衡数,并求出一段闭区间中平衡数的个数.所谓的平衡条件即为力臂与 力相乘后两端的数量和可以抵消,例如数字4139可以视为以3为中轴的 ...

  3. HDU 5787 wolf Number 数位dp

    题意 题目就是说让我们在l到r的数字中求得有多少个连续k为不相同的数 1≤L≤R≤1e18 2≤K≤5 Time Limit: 6000/3000 MS (Java/Others) Memory Li ...

  4. HDU 3555 Bomb(数位DP模板啊两种形式)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555 Problem Description The counter-terrorists found ...

  5. HDU 6156 Palindrome Function 数位DP

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6156 题目描述: 求L~R所有的数的l~r进制的f(x), f(x) = 当前进制 如果回文串, f ...

  6. Hdu 2089-不要62 数位dp

    题目: http://acm.hdu.edu.cn/showproblem.php?pid=2089 不要62 Time Limit: 1000/1000 MS (Java/Others)    Me ...

  7. HDU 2089 不要62 数位DP

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2089 题目描述: 给定一个区间, 让你求这个区间中所有不带62 或 4 的数的个数 解题思路: 很明 ...

  8. fzu 2109 Mountain Number 数位DP

    题目链接:http://acm.fzu.edu.cn/problem.php?pid=2109 题意: 如果一个>0的整数x,满足a[2*i+1] >= a[2*i]和a[2*i+2],则 ...

  9. HDU 3271 SNIBB(数位DP+构造)

    思路:数位DP+构造,先dp[i][j]表示i位总和为j的情况数,然后两种情况分别去进行数位DP,按高位往低位放去构造即可 代码: #include <cstdio> #include & ...

最新文章

  1. Linux内部的时钟处理机制全面剖析
  2. 马斯克很着急:加速打造“月球电梯”,他要从NASA手中抢到这一单
  3. appium+python自动化40-adb offline(5037端口被占)
  4. python open permission denied_python - Image.open PermissionError:[Errno 13]权限被拒绝: - 堆栈内存溢出...
  5. node中间件mysql_nodejs 中使用mysql数据有没有类似 mongoose 的中间件?
  6. ArcGIS Engine Runtime 10 Setup步骤
  7. 论文浅尝 - ICML2020 | 跨域对齐的图最优运输算法
  8. 前轮转向最大角度设计原来_转向不足是怎么回事?我们怎么去改变这种特性
  9. 当前脚本文件中调用另外一个脚本
  10. js变量按照存储方式区分,有哪些类型,并表述其特点
  11. 《Java从入门到放弃》JavaSE入门篇:练习——单身狗租赁系统
  12. Mixly米思齐_点阵
  13. 黑苹果安装经验整理|再见丁小果
  14. 【极客学院】-iOS学习笔记-2-Xcode(安装,创建项目,工作空间)
  15. 创业者的噩梦 - 怎么就侵权了
  16. Android Framework启动流程
  17. 网页无法访问怎么解决(已解决)
  18. JavaScript 音乐播放器
  19. flash游戏代码html5,Flash贪吃蛇游戏AS代码翻译
  20. java设计模式 之 模板方法模式

热门文章

  1. [Freescale]E9学习笔记-LTIB总结
  2. firefox addons
  3. 源码搭建lamp环境
  4. Mantis-如何自定义流程状态
  5. java什么是同步_什么是同步?什么是互斥?
  6. 文字投影_店铺门口投影灯,引领店铺新潮流
  7. java xml导出_java 导出xml文件的四种方式
  8. eclipse Maven项目发布到Tomcat下classes文件夹却没有子模块的编译类
  9. Map<String,Object>接收参数,Long类型降级为Integer,报类型转换异常
  10. 将表中的数据自动生成INSERT、UPDATE语句