算法笔记——数位DP

一、前置知识

1.DP小知识

D P DP DP 是一种算法思想,用递推方程的方式解决问题。但是使用它要满足如下性质:

  • 最优子结构: 子结构优秀,整个就优秀。
  • 无后效性:当前决策不会影响后面。

2.DP实现方法

众所周知, D P DP DP 可以使用记忆化搜索实现。模板:

int dp[状态];
int dfs(当前状态){if (满足退出条件) return 退出返回值;if (dp[当前状态]!=-1) return dp[当前状态];int ans=0; 辅助变量进行状态转移return dp[当前状态]=ans;
}memset(dp,-1,sizeof(dp));

二、问题提出

给你一个区间 [ l , r ] [l,r] [l,r] 和一个条件,求区间内满足条件的数的个数。

要求复杂度 O ( l o g 10 n ) O(log_{10}n) O(log10n)

三、解决问题

我们以一个具体问题入手:数页码。

看如下树形图:

接下来我们可以设计转移:

int dp[20][210];//dp[i][j]表示i位和为j的数字个数

但是如果改一下:
在这里插入图片描述
我们会发现,有时数位有限制,所以我们要增加一维 l i m lim lim,表示是否有限制。

强调一下: 有的问题会有 前导零的特殊处理方式,则需要加一位 z e ze ze,表示有没有前导零。

四、蓝题解答

windy数。

可以增加一维 p r e pre pre,表示上一位去什么数。(本题涉及前导零,请谨慎思考)。

代码(附带模板):

#include <bits/stdc++.h>
using namespace std;
#define int long long
int dp[20][10][2][2],num[20],tot;
//id pre lim
int dfs(int id,int pre,int lim,int ze){//位数,前一位 ,限制,前导零//if (id!=tot&&ze)if (id==0) return 1-ze;if (dp[id][pre][lim][ze]!=-1){return dp[id][pre][lim][ze];}int ans=0,up=(lim?num[id]:9);for (int i=0; i<=up; i++){if (abs(pre-i)>=2||ze){ans+=dfs(id-1,i,lim&&(i==up),ze&&(i==0));}}//cout<<id<<" "<<pre<<" "<<lim<<" "<<ze<<" "<<ans<<"\n";return dp[id][pre][lim][ze]=ans;
}int solve(int x){tot=0; memset(dp,-1,sizeof(dp));while (x) num[++tot]=x%10,x/=10;//cout<<tot<<"\n";return dfs(tot,0,1,1); 
}
signed main(){int l,r; cin>>l>>r;cout<<solve(r)-solve(l-1);//cout<<solve(r)<<" "<<solve(l-1);
}

五、特别说明

今天是母亲节,要特别感谢妈妈!

没有她们的大力支持,就没有我们这些 蒟蒻 OIer。

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

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

相关文章

【Java】Java基础 使用集合实现斗地主分牌

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 目录 0.思路 1.创建玩家手牌集合 2.创建牌堆 3. 把牌放入牌堆 4.洗牌 5.进行分牌 6.完整代码 今天使用集合TreeSet来实现一个斗地主的分牌流程。 TreeSet集合的一个特点就是 元素有序&#xff0c;这样就方便…

定期更新与维护:技术与生活的同步律动

在这个数字化时代&#xff0c;科技的温暖之光照进了盲人朋友们的日常生活中&#xff0c;特别是那些辅助出行的应用程序&#xff0c;它们如同贴心的向导&#xff0c;引领着用户穿越城市的喧嚣与宁静。然而&#xff0c;要确保这些应用始终能够高效、安全地服务于盲人用户&#xf…

Seaborn用法大全

原文连接: https://blog.csdn.net/qq_38614074/article/details/138251530 # Seaborn介绍 Seaborn是一个基于Python的数据可视化库&#xff0c;它建立在matplotlib的基础之上&#xff0c;为统计数据的可视化提供了高级接口。Seaborn通过简洁美观的默认样式和绘图类型&#xff…

如何用networkx实现最短路径的求解

您可以使用networkx库中的最短路径算法来求解最短路径。下面是一个使用networkx库的示例代码&#xff1a; import networkx as nx# 创建有向图 G nx.DiGraph()# 添加带权重的边 G.add_edge(A, B, weight4) G.add_edge(A, C, weight2) G.add_edge(B, C, weight1) G.add_edge(B…

Java随笔1

1.编程中组件的概念&#xff1a; 在编程中&#xff0c;组件&#xff08;Component&#xff09;通常指的是一种可重用的、模块化的代码单元&#xff0c;它封装了特定的功能或用户界面元素&#xff0c;并提供了与其他代码进行交互的接口。组件可以看作是对数据和方法的简单封装&…

锁策略详解:互斥锁、读写锁、乐观锁与悲观锁、轻量级锁与重量级锁、自旋锁、偏向锁、可重入锁与不可重入锁、公平锁与非公平锁

一.锁策略 锁策略指的是在多线程编程中用于管理共享资源访问的规则和技术。它们确保在任何给定时间只有一个线程可以访问共享资源&#xff0c;以防止竞态条件和数据不一致性问题。常见的锁策略包括&#xff1a; 互斥锁&#xff08;Mutex&#xff09;&#xff1a;最常见的锁类型…

深入理解C++中的多态性

目录标题 1. 多态性简介2. 静态多态函数重载模板 3. 动态多态虚函数new动态分配内存纯虚函数和抽象类 4. 多态的应用5. 总结 在C编程中&#xff0c;多态性是一种使得相同的消息或操作可以应用于不同的对象&#xff0c;并根据对象的类型产生不同行为的能力。C通过虚函数&#xf…

王者营地ip地址怎么隐藏

在数字化快速发展的今天&#xff0c;网络安全和隐私保护成为了每个人都需要面对的重要问题。作为一款备受欢迎的游戏社区应用&#xff0c;王者营地为用户提供了丰富的游戏信息和交流平台。然而&#xff0c;与此同时&#xff0c;用户的IP地址也可能在不经意间被泄露&#xff0c;…

spring框架定时任务(@Scheduled)

内容&#xff1a; 在spring框架中&#xff0c;scheduled注解是用于声明定时任务的&#xff0c;以最简单的方式来创建定时任务。 注意&#xff1a; 要使用scheduled注解&#xff0c;需要确保已下几点&#xff1a; 1.spring应用程序已经开启了定时任务的开启。需要在配置类&am…

WPS加载项(wps jsapi)创建、发布及部署

安装wpsjs及其他具体细节参考WPS加载项官网地址https://open.wps.cn/previous/docs/client/wpsLoad 1&#xff0c;试验环境 node 20.12.1 npm 10.7.0 wpsjsrpcsdk.js,改动时间&#xff1a;2022-11-28 19:06, 大小80.2 KB (82,192 字节) wps&#xff0c;WPSPro_11.8.2.12195.e…

TCP与HTTP的关系?

TCP与HTTP的关系&#xff1f; 它们在TCP/IP七层通信架构的位置不同&#xff1a; 对于HTTP协议&#xff0c;它是在应用层的。对于TCP协议&#xff0c;它是在传输层的。 它们对应的功能不同&#xff1a; 对于TCP协议&#xff0c;它只是负者建立连接断开连接的&#xff0c;但是…

C++(类和对象—封装)

C面向对象的三大特性 封装 继承 多态 C认为万事万物皆为对象&#xff0c;对象上有其属性和行为 什么是封装&#xff1f; 封装是C面向对象三大特性之一 封装的意义: 将属性和行为作为一个整体&#xff0c;表现生活中的事物 将属性和行为加以权限控制封装意义一: …

torch.compile() 加速推理速度

条件&#xff1a; 需安装2.0及以上版本的torch即可。 优势&#xff1a; 根据模型和GPU的不同&#xff0c;torch.compile()在推理过程中可以提高多达30%的速度。 使用方式&#xff1a; vae_config OmegaConf.load("kl-f8/config.yaml")vae_model load_model_from_…

博客互动革命:如何打造活跃读者社区并提升参与度

CSDN 的朋友你们好&#xff0c;我是未来&#xff0c;今天给大家带来专栏【程序员博主教程&#xff08;完全指南&#xff09;】的第 10 篇文章“与读者互动”。本文揭示了提升技术博客参与度的秘诀。从评论互动到社交媒体策略&#xff0c;本文将指导你如何建立强大的读者社区。掌…

MySQL面试之什么是聚合函数、事务、索引?(通俗易懂版)

1、聚合函数&#xff1a; MySQL中的聚集函数用于对一组数据进行计算并返回单个结果。常见的聚集函数包括&#xff1a; COUNT()&#xff1a;用于计算结果集中行的数量。SUM()&#xff1a;对结果集中的数值列进行求和。AVG()&#xff1a;计算结果集中数值列的平均值。MAX()&…

MYSQL数据库-SQL语句

数据库相关概念 名称全称简称数据库存储数据的仓库&#xff0c;数据是有组织的进行存储DataBase(DB)数据库管理系统操纵和管理数据库的大型软件DataBase Management System(DBMS)SQL操作关系型数据库的编程语言&#xff0c;定义了一套操作关系型数据库统一标准Structured Quer…

win10电脑录屏全攻略,从入门到精通,一篇文章就够了!

在当今科技时代&#xff0c;电脑录屏已经成为人们生活中越来越重要的一部分。无论是工作还是娱乐&#xff0c;我们都可能需要录制电脑屏幕来保存或分享一些内容。在本文中&#xff0c;我们将向您介绍win10电脑录屏的三种方法&#xff0c;并对每种方法进行详细说明&#xff0c;为…

宝塔安装多个版本的PHP,如何设置默认的PHP版本

如何将默认的PHP版本设置为7.3.32&#xff0c; 创建软链接指向7.3版本&#xff0c;关键命令&#xff1a;ln -sf /www/server/php/73/bin/php /usr/bin/php 然后再查看PHP版本验证一下结果 [rootlocalhost ~]# ln -sf /www/server/php/73/bin/php /usr/bin/php [rootlocalho…

青蒿素优化算法(AO)-2024年新算法-公式原理详解与性能测评 Matlab代码免费获取

声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类智能优化算法及其改进的朋友&#xff0c;可关注我的公众号&#xff1a;强盛机器学习&#xff0c;不定期会有很多免费代码分享~ 目录 原理简介 一、初始化阶段 二、综合淘汰阶…

你的网络安全证书SSL如何安装?

网络安全证书SSL是用于加密网页和保护用户个人信息的重要工具&#xff0c;它通过SSL/TLS协议提供安全的数据传输通道&#xff0c;帮助确保网站和用户之间的通信是加密的&#xff0c;防止敏感信息被窃取或篡改。安装SSL证书是网站管理员确保网站安全性的重要一步。下面将介绍SSL…