动态规划-数位dp-1012. 至少有 1 位重复的数字
时间:2020-05-17
本文章向大家介绍动态规划-数位dp-1012. 至少有 1 位重复的数字,主要包括动态规划-数位dp-1012. 至少有 1 位重复的数字使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
2020-05-17 09:03:13
问题描述:
给定正整数 N,返回小于等于 N 且具有至少 1 位重复数字的正整数的个数。
示例 1:
输入:20
输出:1
解释:具有至少 1 位重复数字的正数(<= 20)只有 11 。
示例 2:
输入:100
输出:10
解释:具有至少 1 位重复数字的正数(<= 100)有 11,22,33,44,55,66,77,88,99 和 100 。
示例 3:
输入:1000
输出:262
提示:
1 <= N <= 10^9
问题求解:
经典的数位dp题,需要注意的是leading zero不能算为使用过的数字即可。
int[] digits = new int[64]; // pos,limit, used,f,lead int[][][][][] dp = new int[12][2][1 << 10][2][2]; public int numDupDigitsAtMostN(int N) { int pos = 0; while (N > 0) { digits[pos++] = N % 10; N /= 10; } //for (int i = pos - 1; i >= 0; i--) System.out.println(digits[i]); for (int i = 0; i < 12; i++) { for (int j = 0; j < 2; j++) { for (int k = 0; k < 1 << 10; k++) { for (int t = 0; t < 2; t++) { Arrays.fill(dp[i][j][k][t], -1); } } } } return dfs(pos - 1, 1, 0, 0, 1); } private int dfs(int pos, int limit, int used, int f, int lead) { if (pos == -1) return f == 1 ? 1 : 0; if (dp[pos][limit][used][f][lead] != -1) return dp[pos][limit][used][f][lead]; dp[pos][limit][used][f][lead] = 0; int up = limit == 1 ? digits[pos] : 9; for (int i = 0; i <= up; i++) { int ns = used; if (!(lead == 1 && i == 0)) ns = ns | (1 << i); int flag = 0; if (((1 << i) & used) != 0) { if (i == 0 && lead == 1) flag = 0; else flag = 1; } dp[pos][limit][used][f][lead] += dfs(pos - 1, limit == 1 && i == up ? 1 : 0, ns, f == 1 || flag == 1 ? 1 : 0, lead == 1 && i == 0 ? 1 : 0); } return dp[pos][limit][used][f][lead]; }
原文地址:https://www.cnblogs.com/hyserendipity/p/12903933.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Mongodb多键索引之数组文档
- 在 Cocos Creator 里画个炫酷的雷达图
- 用shader做一个柿子颜色的过场动画
- mysql 找出最新时间的一条数据
- 【NPM库】- 0x05 - 文件、路径操作
- MySQL中insert阻塞问题的分析
- Fedora32下编译安装Qemu5.1并创建ARM版本Linux虚拟机
- 面试官想问的HashMap,都在这一篇里面了!
- CentOS7下使用Mondo Rescue实现系统全备份
- CentOS7下搭建Rsyslog Server记录远程主机系统日志
- 企业运维经典面试题汇总(4)
- 使用QEMU模拟树莓派Raspberry Pi
- Octave梯度下降法最优化代价函数的一个例子—ML Note 38
- Spring Boot入门系列(十八)mybatis 使用注解实现增删改查,无需xml文件!
- Mongodb多键索引之嵌套文档