简介

数位DP是一种计数的DP,一般就是要统计一个区间[l,r]内满足一些条件的个数。所谓数位DP, 意思就是在数位(个位,十位,百位,,,)上进行DP。

对于这种问题的求解思路:先得出解ans[x]([1,x]区间内满足条件的个数)的方法,利用前缀和的思路,最终的解为ans[r] - ans[l-1]。

问题的关键是:怎么求ans[x]?

我们采用枚举的方式,控制上界枚举,从最高位开始往下枚举,例如: x = 213,那么我们从百位枚举,百位的可能情况是0,1,2,

当百位是1 的时候,十位和个位都是从0到9;当百位是2的时候,十位就从0到1。。。。总之不要枚举超过上界213就可以了。

例题---600. 不含连续1的非负整数

给定一个正整数 n,找出小于或等于 n 的非负整数中,其二进制表示不包含 连续的1 的个数。

class Solution {
public:int a[111];int dp[33][2];int dfs(int pos,int state,bool limit){if(pos == -1)return 1;if(!limit && dp[pos][state] != -1)return dp[pos][state];//未达到上限,记忆化int up = limit?a[pos]:1;int sum = 0;for(int i = 0;i<=up;++i){if(state && i == 1)continue;sum += dfs(pos-1,i==1,limit && i == up);}if(!limit)dp[pos][state] = sum;//记忆化return sum;}int solve(int x){int pos = 0;while(x){a[pos++] = x&1;x >>= 1;}return dfs(pos-1,0,1);}int findIntegers(int num) {memset(dp,-1,sizeof(dp));return solve(num);}};

例题---不要62 HDU - 2089

题意:给定一个区间,求出“吉利数”的个数。吉利数:不含62或4

#include<bits/stdc++.h>using namespace std;int a[22];
int dp[22][2];int dfs(int pos,int state,bool limit)
{if(pos == -1) return 1;if(!limit && dp[pos][state] != -1)return dp[pos][state];int up = limit?a[pos]:9;int sum = 0;for(int i = 0;i <= up;++i){if(state && i == 2)continue;if(i == 4)continue;sum += dfs(pos-1,i==6,limit && i == up);}if(!limit)dp[pos][state] = sum;return sum;
}int solve(int x)
{int pos = 0;while(x){a[pos++] = x%10;x /= 10;}return dfs(pos-1,0,true);
}int main()
{int l,r;while(cin>>l>>r && l + r){memset(dp,-1,sizeof dp);cout << solve(r) - solve(l-1) << endl;}
}

例题---整数中1出现的次数(从1到n整数中1出现的次数)

leetcode233. 数字 1 的个数

class Solution {
public:int dp[20][20],num[20],cnt=0;int dfs(int pos,int flag,int sum){//sum表示pos位前面有几个1if(pos == -1)return sum;if(!flag && ~dp[pos][sum])return dp[pos][sum];//dp[pos][sum]表示到第pos位之前有sum个1的记忆搜索值是多少int up = flag? num[pos]:9,ans = 0;for(int i = 0;i<=up;++i){ans+=dfs(pos-1,flag && (i == up),sum+(i==1));}if(!flag)dp[pos][sum] = ans;return ans;}int cal(int x){while(x){num[cnt++]=x%10;x/=10;}return dfs(cnt-1,1,0);}int countDigitOne(int n) {if(!n)return 0;memset(dp,-1,sizeof dp);return cal(n);}
};//数学方法,数学方法蛮好理解的,写个数字推一下就好了。
class Solution {
public:int NumberOf1Between1AndN_Solution(int n){if(n<1)return 0;long long ans = 0;long long round = n;long long base = 1;while(round){int w = round % 10;round /= 10;ans += round * base;if(w == 0)ans += 0;else if(w == 1)ans += (n%base)+1;else ans += base;base *= 10;}return ans;}};

LeetCode---数位DP相关推荐

  1. 【LeetCode笔记】剑指Offer 43. 1~n 整数中1出现的次数(Java、数位dp、偏数学)

    文章目录 题目描述 思路 && 代码 二刷 打卡第九天啦- 题目描述 有点像数字序列中的某一位 思路 && 代码 主体思路:从低到高,计算出每一位出现的1的个数. 三种 ...

  2. 365天挑战LeetCode1000题——Day 117 数位DP II

    数位DP模板 # i: 第i位到最后一位的dp状态-- # mask: 可选择的数字-- # isLimit: 是否限制该位大小,如果没有,那么可以选择0-9,否则需要计算上界s[0] - 'i' # ...

  3. 【bzoj 1833】【codevs 1359】 [ZJOI2010]count 数字计数(数位dp)

    1833: [ZJOI2010]count 数字计数 Time Limit: 3 Sec  Memory Limit: 64 MB Submit: 2774  Solved: 1230 [Submit ...

  4. 不要62 ---数位DP

    题意:求m到n中不含62和4的数的个数. 题目链接 思路:数位dp模板求满足的数字或不满足的数字,刚学,就求不满足的数. #include<stdio.h> #include<str ...

  5. bzoj 3598 [ Scoi 2014 ] 方伯伯的商场之旅 ——数位DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3598 数位DP...东看西看:http://www.cnblogs.com/Artanis/ ...

  6. cojs 简单的数位DP 题解报告

    首先这道题真的是个数位DP 我们考虑所有的限制: 首先第六个限制和第二个限制是重复的,保留第二个限制即可 第五个限制在转移中可以判断,不用放在状态里 对于第一个限制,我们可以增加一维表示余数即可 对于 ...

  7. 数位DP 不断学习中。。。。

    1, HDU 2089  不要62 :http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意:不能出现4,或者相邻的62, dp[i][0],表示不存在不吉 ...

  8. [数位dp] spoj 10738 Ra-One Numbers

    题意:给定x.y.为[x,y]之间有多少个数的偶数位和减去奇数位和等于一. 个位是第一位. 样例: 10=1-0=1 所以10是这种数 思路:数位dp[i][sum][ok] i位和为sum 是否含有 ...

  9. 数位dp(求1-n中数字1出现的个数)

    题意:求1-n的n个数字中1出现的个数. 解法:数位dp,dp[pre][now][equa] 记录着第pre位为now,equa表示前边是否有降数字(即后边可不能够任意取,true为没降,true为 ...

  10. 数位dp ---- 2020 icpc 上海 Sum of Log(枚举高位的二进制数位dp)

    题目链接 题目大意 : 解题思路: 这里有个很核心的地方就是log2(i+j)\text{log2(i+j)}log2(i+j)本质上就是看看i+j\text{i+j}i+j的二进制高位在哪里? 那么 ...

最新文章

  1. R语言将多张可视化结果图像保存到PDF中实战:多图保存到同一PDF页、将多个绘图保存到PDF格式的不同页面
  2. 2021年双十一大复盘:众人唱衰双十一,我们却发现了这些机会
  3. python用一行代码计算1~100的和(用reduce()和sum()内置函数实现)
  4. S变化广义s变化和时频域特征-matlab
  5. 关于stm32通过can与epos控制器建立通信,从而控制Maxon电机运转并且实时检测电机参数
  6. UE 材质编辑器快捷键
  7. 计算机硬盘损坏 数据如何修复,硬盘坏了怎么修复 教你如何修复硬盘坏道
  8. split 逗号或分号_分号或不分号
  9. esxi 环境 西数硬盘测试软件,手把手教你测试固态硬盘!硬盘测试软件大汇总
  10. Android自学笔记:Tab控件源码剖析
  11. Cloud 团队:让 TiDB 在云上跳舞 | PingCAP 招聘季
  12. 阿里云的esc服务器介绍
  13. 电脑桌面app客户端、微信公众号-小程序测试方法
  14. Python:启程 数据分析-牛客网在线编程-中级函数12-23
  15. 短信验证码测试点整理
  16. WS2812原理及实现
  17. vscode 最详细的调试
  18. 安全测试中sql注入测试思路
  19. 100寸大屏幕的影院观感 神画Q1智能影院了解一下
  20. Eclipse优化速度

热门文章

  1. excel如何快速选择一列数据
  2. MAC系统中的轻量级图像浏览器Lyn1.9
  3. java线程 cpu占用率_多线程程序 怎样查看每个线程的cpu占用
  4. Java-pdf下载加水印
  5. 面试创业公司一面总结
  6. 激活函数在神经网络中的作用
  7. JAVA关于StringBuffer的一些方法
  8. win10任务栏出现无法删除的空白块
  9. 前端框架OnsenUI学习之ons-navigator介绍
  10. 天下贰的朋友们进来看下!!