简单数位DP总结

数位dp简单题目汇总 地址:http://acm.hdu.edu.cn/showproblem.php?pid=2089 不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 15221    Accepted Submission(s): 阅读详情

数位dp,顾名思义,其实就是在数位上进行的dp。为何需要在数位上进行dp?自然是因为暴力不合适。

例如:求a~b中不包含49的数的个数. 0 < a、b < 2*10^9
注意到n的数据范围非常大,暴力求解是不可能的,考虑dp,如果直接记录下数字,数组会开不起,该怎么办呢?要用到数位dp。

数位dp一般应用于:
1. 求出在给定区间[A,B]内,符合条件P(i)的数i的个数.
2. 条件P(i)一般与数的大小无关,而与 数的组成 有关.

例题1:HDU 2089
题目很简单,事实上由于数据量很小,直接暴力打表然后O(1)也是可以做的。练习数位dp。


#include<bits/stdc++.h>
using namespace std;

int a, b,num[20],dp[20][2];
//记忆化搜索,可以有效减少时间
//flag判断前一层是否是6,limit用来判断这一层能取到的最大值
int dfs(int len, bool flag, bool limit)
{
    if (len == 0)
        return 1;
    if (!limit && dp[len][flag])
        return dp[len][flag];
    int cnt = 0, maxx = (limit ? num[len] : 9);
    for (int i = 0; i <= maxx; i++){
        if (i == 4 || flag && i == 2)
            continue;
        cnt += dfs(len - 1, i == 6, limit && i == maxx);
    }
    return limit ? cnt : dp[len][flag] = cnt;
}

int solve(int x)
{
    memset(num, 0, sizeof(num));
    int k = 0;
    while (x)
    {
        num[++k] = x % 10;
        x /= 10;
    }
    return dfs(k, false, true);
}

int main()
{
    while(~scanf("%d%d", &a, &b)&&a!=0&&b!=0)
    {
        printf("%d\n", solve(b) - solve(a - 1));
    }
    return 0;
}

例题2:HDU 4734

边界:
dp[i][j]如果j小于0,显然是dp[i][j]=0的,如果i==0,说明就是0,显然任何数都比0大,所以dp[i][j]对于j>=0的时候dp[i][j]=1,否则dp[i][j]=0。

状态转移:
dp[i][j]+=dp[i-1][j-k*(1<<(i-1))];

#include<bits/stdc++.h>
using namespace std;

int dp[10][200000], mx[10];
int dfs(int len, int pre, bool flag)
{
    if (len < 0)
        return pre >= 0;
    if (pre < 0)
        return 0;
    if (!flag && dp[len][pre] != -1)
        return dp[len][pre];
    int maxn = flag?mx[len]:9, ans = 0;
    for (int i = 0; i <= maxn; ++i) {
        ans += dfs(len-1, pre-i*(1<<len), flag&&i==maxn);
    }
    return flag?ans:dp[len][pre] = ans;
}

int f(int x)
{
    int tmp = 1, ans = 0;
    while (x) {
        ans += x%10*tmp;
        x /= 10;
        tmp *= 2;
    }
    return ans;
}

int cal(int a, int b)
{
    int top = 0;
    while (b) {
        mx[top++] = b%10;
        b /= 10;
    }
    return dfs(top-1, f(a), true);
}

int main()
{
    int T;
    int a, b;
    scanf("%d", &T);
    memset(dp, -1, sizeof(dp));
    for(int tt=1;tt<=T;tt++){
        scanf("%d %d", &a, &b);
        printf("Case #%d: %d\n",tt , cal(a, b));
    }
    return 0;
}
Android HCE模拟NFC标签:实现跨设备NDEF数据共享 本文详细介绍了Android HCE技术如何模拟NFC标签实现跨设备NDEF数据共享。通过核心代码实现和标准AID配置,使手机能够被第三方NFC应用直接读取,支持文本、网址、Wi-Fi配置等多种数据类型,大幅提升设备间数据交换的便捷性和兼容性。 阅读详情

相关推荐

一文了解向量数据库在RAG中扮演的角色

向量数据库:AI新纪元的基石。探索如何通过这一创新技术优化RAG,提高语言模型的信息处理能力

2401_82452722的博客 2452

【算法小讲堂】数位dp(简单入门)

数位打牌 爷爷,你没有关注的博主又更新博客啦!!   数位dp(打牌),这是一个相当深刻的话题。在不会这个内容的时候就是一脸懵逼。这里我们主要介绍的是dfs模式实现的数位打牌模式   当然博主也不是说自己会这个高深的算法了,只是看(抄)完别人的代码,突有所悟。又厚颜无耻的出一期博客啦! 先来个简单点的问题吧。 给出一个数n,1~n有多少数不包含49,测试数据1<=T<=10000,1...

生姜也想变好吃的博客 1万+

LDPC码译码原理——概率公式推导

怎么说呢,一直以来都想写一下博客。近半年多来我一直在学习LDPC码译码上的东西,主要是在FPGA实现上的,所以这次想写一些关于这方面的内容,包括译码的原理、仿真以及实现。(当然是基于准循环LDPC码上实现的)不过呢,我写这个的初衷是为了让初学者理解入门用的,而不是在大牛面前班门弄斧,有错误之处欢迎大家批评指正。不知道会不会有人一开始像我一样,为了学好LDPC码,先去好好了解其它的诸如RS码或者是卷...

stand_by_me123的博客 2万+

【学习笔记】数位DP(简单题)

前言 本来写的超级多超级繁琐,可是被csdn搞了,然后就没了。现在重写一遍,重新理清思路,只放关键的代码。 数位dp 求区间[l,r]内,满足某条件的数的个数,这个条件一般与数的组成有关;或者统计某个量,这个量也与数的组成有关。如求不含4的数的个数,含13且能被13整除的数的个数,区间内所有数码的出现次数等。 解法 首先这样的题一般满足前缀性质,即[l,r]内的答案可以变为[1,r]-[...

秋叶红于二月花 1060

C#海康威视摄像头控制,将IntPtr转换成Bitmap图片

C#通过skd控制海康威视摄像头,获取bitmap格式图片

ReflexMechanism的博客 6586

PCL 快速均匀下采样

快速均匀下采样 是一种点云降采样技术,通过设置采样步长来实现等距降采样,从而减少点的数量。用户可以通过指定步长,选择每隔一定数量的点采样一个点,这样可以在保持点云几何特性的同时,显著减少点的数量。

纵马踏花向自由 871

数位DP入门

转载:https://blog.youkuaiyun.com/brazy/article/details/77427699 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;https://www.cnblogs.com/zbtrs/p/6106783.html

qq_36386435的博客 245

Android SystemUI——初始化流程(三)

1、Android 系统在启动之后,首先会Zygote进程,Zygote进程又会进一步启动 SystemServer进程,它会启动各种系统所需要的服务,在监听AMS启动完毕之后,还会启动SystemUIService。2、在启动SystemUIService服务之前,系统首先会创建SystemUI对应的进程,获取SystemUIAppComponentFactory实例对象,调用instantiateApplicationCompat创建SystemUIApplication实例对象并设置回调方法。

小旭的专栏 1158

HDU3555 Bomb——简单数位DP

点这里 题意: 统计n以内含49的数的个数。 题解: 定义状态dp[i][] dp[i][0]表示i位数里不含49的个数。 dp[i][1]表示i位数里不含49,但首位是9的个数。 dp[i][2]表示i位数里含49的个数。 过程中犯的错: dig数组忘记初始化,影响下一次数据的答案。 一般DP #include<bits/stdc++.h> using namespace std; typedef long long ll; int t, dig[65]; ll n, dp[6

lllllan 185

12、知识图谱数据处理与推理全解析

本文深入解析了知识图谱中的数据处理与推理技术,涵盖SHACL的多种约束类型(如值约束、范围约束、字符串约束、逻辑约束等)及其在数据质量控制中的应用,并介绍了常用的SHACL工具与实际案例。文章对比了SPARQL与SHACL的特点,探讨了RDF(S)的局限性,引出表达能力更强的OWL和OWL2语言及其在语义网和生物医学等领域的应用。此外,还阐述了规则在知识表示中的作用,包括产生式规则和Datalog规则,并总结了知识图谱中推理的重要性与典型流程,为构建高质量、可推理的知识图谱提供了全面的技术指导。

zz67890的博客 136

SAE ARP 4761A内容详解

SAE ARP 4761A主要为民用航空系统及设备的安全评估提供指南,帮助制造商和设计者满足FAA的FAR 25.1309等适航标准的要求。该文档旨在为航空器和航空系统设计中涉及的安全评估流程提供一个结构化的框架,并结合一系列工具和方法,如故障树分析(FTA)、依赖图分析(DD)、马尔可夫分析(MA)等,来系统地评估潜在的安全隐患。这一标准不仅适用于大型航空器的设计和评估,还可以应用于各种类型的飞行系统,如无人驾驶飞行器(UAV)和新型的电动垂直起降飞机(eVTOL)。

qq_41854911的博客 3149

数位DP

在了解数位dp之前,先来看一个问题:       例1.求a~b中不包含49的数的个数. 0 &lt; a、b &lt; 2*10^9 注意到n的数据范围非常大,暴力求解是不可能的,考虑dp,如果直接记录下数字,数组会开不起,该怎么办呢?要用到数位dp.      数位dp一般应用于:   求出在给定区间[A,B]内,符合条件P(i)的数i的个数.   条件P(i)一般与数的大小无关,而...

c___c18的博客 2363

10分钟极速SpringBoot项目搭建:OpenClaw AI实战攻略

OpenClaw,作为一款革命性的 AI 工具,凭借其强大的智能体能力,能够在短短 10 分钟内,帮助开发者从零构建一个完整的 SpringBoot 项目,实现真正的极速开发。它不仅极大地提高了开发效率,还降低了开发门槛,让更多的开发者能够专注于业务逻辑的实现,而无需被繁琐的配置工作所困扰

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 298

数位dp的简单模板

摘自https://blog.youkuaiyun.com/wust_zzwh/article/details/52100392 typedef long long ll; int a[20]; ll dp[20][state];//不同题目状态不同 ll dfs(int pos,/*state变量*/,bool lead/*前导零*/,bool limit/*数位上界变量*/)//不是每个题都要...

weixin_30852419的博客 65

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

简单数位DP

不要62  http://acm.hdu.edu.cn/showproblem.php?pid=2089 求 (n,m)之间不含 4 和 62 的个数 , (0 DP[i][j]表示 从高位起 的 当前第i位状态为j的 且不在数值边界的 符合条件的 数字个数。上一位 是6 j=1,否则f=0; 记忆化搜索,注意数值边界不能用dp[][]记忆化。 #include #include #inc

Napoleon 1168

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

简单的数位dp

hdu 2089 设dp[len][flag],flag = 1表示前一位是6,否则前一位不是6. #include #include #include #include #include #include #include #include #include #include #include #include #include #define LL __i

1342

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

简单数位dp

如:34 与 345 , 由于前面的数都贴合,所以当我们枚举下一位的时候,我们枚举的选择只能是 0~5. 也就是0~N在这一位的数位。我们第一个数枚举的是1,显然,不管后面五个数是什么,我们都不会超过N,所以,在不受限制的情况下,后面五个数能产生的1的总和是固定的。枚举完以1开头的数后,当我们枚举到以2开头的数,发现此时后面五个数仍然不受限制,所以,这与上一种的答案是一样的。如果我们枚举的数,从某一位开始不贴合的话,那么从这一位之后,每一位的枚举范围,将不受限。// 如果枚举完了,直接返回sum。

louisdlee的博客 586

数位dp入门,简单dp

通常我们会遇到这样的一类问题:给定一个上下限,求这个区间内满足某个条件的数的个数。一般最简单的解法就是暴力枚举了:for(int i = low;i &lt;= up;i++) { if(right(condition)) count++; }//low为下限,up为上限,right(condition)为给定的条件 但是往往区间会开的很大,这时候就会超时,...

zhouzzz000的博客 508

Dp练习 -Sakura数 简单数位DP

思路:简单数位DP,dp[pos][pre]表示枚举到pos位时前一位为pre。 考虑前导0以及数据范围自然溢出。 Code: #include &lt;bits/stdc++.h&gt; #define LL unsigned long long using namespace std; const int AX = 20+2; int a[AX]; LL dp[AX][15]; L...

Dave_lzw的博客 458

数位dp简单总结

洛谷日报原文 一些总结: 数位dp的用法 求出在给定区间[A,B]内,符合条件f(i)的数i的个数。条件f(i)一般与数的大小无关,而与数的组成有关。 最高位标记limit的理解 若当前位limit=1而且已经取到了能取到的最高位时,下一位limit=1; 若当前位limit=1但是没有取到能取到的最高位时,下一位limit=0; 若当前位limit=0时,下一位limit=0。 当limit=0时,当前位可取0~9中的任一数字 当limit=1时,当前位pos只可取能取到的最高位(即上界数字的pos位

群山中的菜鸡 202

数位dp的简单使用

题目:给出不多1000位的数,每一位由0、1、2、3组成。 条件:所有的0都在1之前,所有的2都在3之前,0不能在首位,另外0、1、2、3必须出现至少一次。由于数较大所以结果对1000000007取余。 问题:求满足条件的数的数量。 分析:明显这类题目是无法通过暴力遍历解决的。所以需要通过数位dp解决。 #include #include #include using namespace

koobee1的博客 384

简单数位dp及对前导0的理解

数位dp的实质: 一种快速枚举的方式,它满足dp的性质,然后进行记忆化搜。 例题 :牛客-数位小孩 题目描述: 九峰最近沉迷数位dp,这天他又造了个数位dp题: 给出一个区间[l,r][l,r][l,r],求这个区间内有多少个数字满足如下条件: 1.每相邻两个数位和为素数。 2.其中至少一个数位为1。 3.没有前导0。 请你编写程序帮他该题。 输入描述: 一行两个整数l,r(1 <= l <= r <= ),表示给出的区间为[l,r]。 输出描述: 一行一个整...

weixin_52193673的博客 4844

bzoj 1026--windy数 简单数位DP

简单数位DP。 dp[len][start]相当于长度为len,首位数为start符合情况的数的个数,转移方程很容易想得到。 #include&amp;lt;cstdio&amp;gt; #include&amp;lt;cstdlib&amp;gt; using namespace std; long long dp[20][10]; void init(){ for(int i=0;i&amp;lt;10;i++) ...

kaven 1485

HDU 3555 Bomb 简单数位DP

题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=3555

Angry Grass 602

数位dp模板简单解析

数位dp

404 Not Found 809
上一篇: 组合数
下一篇: Hdu 6156 Palindrome Function 2017 CCPC网络赛
CrystalDavid
博客等级 码龄10年 1粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值