HDU odd-even number 数位dp

题意

在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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/425569.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

web

1.添加tomcat 新建动态web 在WebContent下新建index.jsp Windows-->preferences-->Server-->Runtimes Environments 稍后tomcat启动成功&#xff0c;但访问tomcat首页报404 解决方法&#xff1a;将server里的项目removeAll&#xff0c;启动server&#xff0c;双击修改…

[剑指offer][JAVA]面试题第[20]题[表示数值的字符串][状态机]

【问题描述】[中等] 请实现一个函数用来判断字符串是否表示数值&#xff08;包括整数和小数&#xff09;。例如&#xff0c;字符串"100"、"5e2"、"-123"、"3.1416"、"0123"都表示数值&#xff0c;但"12e"、"…

点运算

线性点运算 线性点运算的应用 1&#xff09;如果a>1&#xff0c;输出图像的对比度增大&#xff08;灰度扩展&#xff09; 2&#xff09;如果0<a<1,输出图像的对比度减小&#xff08;灰度压缩&#xff09; 3&#xff09;如果a为负值&#xff0c;暗区域将变亮&#xff…

使用requests模块简单获取数据

一、使用ruquests的基本步骤&#xff1a; 指定url发起请求获取响应对象中的数据持久化存储1 #1 2 url https://www.sogou.com/ 3 #2. 4 response requests.get(urlurl) 5 #3. 6 page_text response.text 7 #4. 8 with open(./sogou.html,w,encodingutf-8) as fp: 9 fp.w…

代数运算

代数运算 概念 代数运算是指两幅或多幅输入图像之间进行点对点的加、 减、乘、除运算得到输出图像的过程。如果记输入图像 为A(x,y)和B(x,y)&#xff0c;输出图像为C(x,y)&#xff0c;则有如下四种形 式&#xff1a; 逻辑运算 在进行图像理解与分析领域比较有用。运用这种方法…

[剑指offer][JAVA]面试题第[21]题[调整数组顺序使奇数位于偶数面前][双指针]

【问题描述】[简单] 输入一个整数数组&#xff0c;实现一个函数来调整该数组中数字的顺序&#xff0c;使得所有奇数位于数组的前半部分&#xff0c;所有偶数位于数组的后半部分。示例&#xff1a;输入&#xff1a;nums [1,2,3,4] 输出&#xff1a;[1,3,2,4] 注&#xff1a;[…

后缀数组 魔板

为什么一开始要再字符串末尾多算个0呢 因为当开始分关键字比较的时候 最后要组成两个 字符所以要多个0 什么你有问我为什么填0 因为0小啊 先处理呗 虽然 sa是根据每个字符确定的大小 也就是排布的每个字符的排名 但是在初次求第二关键字排序的时候 可以使用sa的结论 首…

几何运算

几何运算 .概念 几何运算就是改变图像中物体对象&#xff08;像素&#xff09;之间的空 间关系。 从变换性质来分&#xff0c;几何变换可以分为图像的位置变换 &#xff08;平移、镜像、旋转&#xff09;、形状变换&#xff08;放大、缩小&#xff09;以 及图像的复等合变换…

vmware创建虚拟机并安装centos7系统

一、vmware创建虚拟机 1、添加一个全新的虚拟机 2、以典型的方式创建虚拟机&#xff0c;然后下一步 3、选择稍后安装操作系统&#xff08;这样我们等下可以自由选择操作系统&#xff09;&#xff0c;然后下一步 4、选择客户及操作系统类型及版本&#xff08;由于我这里将安装的…

MySQL学习笔记3——JDBC

目录JDBC简介数据库驱动JDBC第一个JDBC程序JDBC中各对象详解statement对象包装成工具类SQL注入问题PreparedStatement对象使用IDEA连接数据库JDBC操作事务数据库连接池DBCP需要用到的JAR包DBCP配置文件工具类测试代码C3P0需要用到的JAR包C3P0配置文件工具类测试代码结论JDBC简介…

[Leedcode][JAVA][第15题][三数之和][数组][双指针]

【问题描述】[中等] 给你一个包含 n 个整数的数组 nums&#xff0c;判断 nums 中是否存在三个元素 a&#xff0c;b&#xff0c;c &#xff0c;使得 a b c 0 &#xff1f;请你找出所有满足条件且不重复的三元组。注意&#xff1a;答案中不可以包含重复的三元组。 示例&#…

HDU 5882 Balanced Game 分析+欧拉图

题意 就是把判断有五个姿态的剪子包袱锤游戏其中能否平局分析 。。。。code ## /*本题的正确逻辑是分析出图中要求的是个欧拉图因为每个点的入度等于出度每个点的攻防数目都一样所以可以把当前有向欧拉图 转化为无向欧拉图当且仅当 其中没有奇数定点的时候所以这道题 ~ */#i…

Yarn的三种资源调度机制

在企业中并不是只有一个人来执行MapReduce程序单独使用Yarn的资源&#xff0c;实际开发中&#xff0c;会有很多人一起使用Yarn这个资源&#xff0c;如果每个人都提交了job&#xff0c;这个时候Yarn就需要进行调度去分配资源给job&#xff0c; 下面三种调度机制&#xff0c;默认…

Java学习笔记9-1——JavaWeb

目录HTTPHTTP请求HTTP响应ServletServlet原理Mapping问题ServletContext获取ServletContext对象ServletContext应用HttpServletResponse下载文件验证码功能实现重定向HttpServletRequestCookie和Session会话CookieSession&#xff08;重点&#xff09;对比ServletContextJSPJSP…

HDU - 5878 A - I Count Two Three H 技巧枚举

题意 输入 t (1≤t≤500000), the number of test cases. t test cases follow. Each test case provides one integer n (1≤n≤109).让我们不小于n的最小的x满足 x2^a*3^b*5^c*7^d 分析 这道题其实就是个枚举 但是不能随便枚举 比如 如果向这样枚举的话scanf("%lld&q…

[剑指offer][JAVA]面试题第[22]题[j剑指offer][双指针][快慢指针]

【问题描述】[中等] 输入一个链表&#xff0c;输出该链表中倒数第k个节点。为了符合大多数人的习惯&#xff0c;本题从1开始计数&#xff0c;即链表的尾节点是倒数第1个节点。例如&#xff0c;一个链表有6个节点&#xff0c;从头节点开始&#xff0c;它们的值依次是1、2、3、4…

灰度重采样(Gray Resampling

插值方法 nearest——最邻近点插值。它根据已知两点间的插值 点和这两已知点间位置的远近来进行插值&#xff0c;取较近已知 插值点处的函数值作为未知插值点处的函数值。 linear——线性插值。它将相邻的数据点用直线相连&#xff0c; 按所生成的直线进行插值。 spline——…

java调用python脚本

java调用python脚本 常见的java调用python脚本方式 通过jython.jar提供的类库实现 &#xff08;不建议使用&#xff0c;因为会报module没有找到的错误&#xff0c;总之就是很蛋疼&#xff0c;要设置一系列的参数&#xff09;通过Runtime.getRuntime()开启进程来执行脚本文件&am…

空间变换方法

空间变换方法可分为简单变换和控制点变换两种方法&#xff0c; 主要介绍了简单变换 法&#xff0c;这里再补充控制点变换方法。 在许多图像处理的应用中&#xff0c;所需的空间变换都很复杂&#xff0c;不是只通过简单的平移、旋转和 缩放等能解决的&#xff0c;而要通过各种不…