[AIGC] 数位动态规划详解

动态规划(DP)是计算机科学中使用的一种寻找大多数最优路径问题的乐高算法技术。而“数位动态规划”(Digit DP)是动态规划的一个特例,主要用于解决数位问题。


文章目录

    • 1. 什么是数位问题?
    • 2. 什么是数位动态规划?
    • 3. 数位动态规划的步骤
    • 4. 数位动态规划的优点
    • leetcode
    • 总结

1. 什么是数位问题?

数位问题,顾名思义,就是涉及到数字的各个位数的问题。例如:求一个区间内各位数字之和为N的所有数,求一个区间内,各位数字中包含1的数量,求一个区间内,各位数字中不包含13的所有数的数量等。

这类问题的直接解决方法存在时间复杂度过高的问题,这个时候就可以使用数位动态规划来解决。

2. 什么是数位动态规划?

数位动态规划是一种对数位问题进行优化求解的方法。核心技巧在于依次考虑数字的每一位数,通过动态规划递推的方式,实现最优解的寻找。

数位动态规划的具体解决手段通常是首先对给定的数以十进制的形式进行分解,然后按照一定的顺序(通常是从高位到低位)逐个处理这些位数,并根据处理过程中遇到的各种情况,进行可行性记录和状态转移,从而达到降低问题复杂度,快速求解问题的目的。

3. 数位动态规划的步骤

  1. 状态定义:根据问题的需求,定义各个状态所表示的含义;

  2. 初始状态和边境状态的选择:分析问题的初始条件,以及每个状态范围的波动情况,确定初始状态和边界状态;

  3. 状态转移方程的确定:根据前一个状态是如何转移到后一个状态的,确定状态转移的方程;

  4. 最优解的寻找:在所有的状态解中,根据问题的需求找出最优解。

4. 数位动态规划的优点

  1. 可以将时间复杂度较高的数位问题优化到一个相对可接受的范围内,大大节省了计算时间;
  2. 只需要合理设计状态和转移方程,注意边界问题,就可以直接进行问题的求解,十分适用于需要精确答案的问题。

leetcode

我们在这里通过一道LeetCode上的题目 (902. 最大为N的数字组合)来学习数位DP。

题目描述:我们有一组排序的数字 D,它是 {‘1’,‘2’,‘3’,‘4’,‘5’,‘6’,‘7’,‘8’,‘9’} 的非空子集。(注意:‘0’ 不包括在内)。现在,我们用这些数字进行组合写数字,想用多少次都可以。例如 “111”,“11”, “1” “123” 都是有效的组合。我们可以如同上面这样拼出的 超过 N 的部分就不需要考虑了,例如当N为 11 时,上面的 “111” 就可以忽略不计。

返回可以用以上集合中的数字拼出的小于或等于N的正整数的数目。

代码实现如下:

class Solution {int[] dp = new int[64], a = new int[64];public int atMostNGivenDigitSet(String[] D, int N) {int m = D.length, len = 0;for (; N > 0; a[++ len] = N % 10, N /= 10);for (int i = 1; i < len; ++ i) dp[i] = (dp[i - 1] + 1) * m;for (int i = len; i > 0; -- i) {int cnt = 0;boolean flag = false;for (String s : D) {int d = s.charAt(0) - '0';if (d < a[i]) cnt ++;else if (d == n[i]) flag = true;}dp[i] += cnt * Math.pow(m, i - 1);if (!flag) break;if (i == 1) dp[i] ++;}return dp[len];}
}

这道题的解决关键是充分理解动态规划,从上一位向下一位转移的过程中思考如何利用之前的字典大小(也就是D的长度m)、是否已经与N有过大小的差异等信息,来实时递推出当前的可选方案数,从而最终得出结果。

数位DP问题的难度在于理解并确定问题的边界状态和状态转移方程。想要熟练掌握数位DP,需要不断地做题和思考,从而积累经验,深入理解其中的奥秘。

总结

总的来说,数位动态规划是一种强大的处理数位问题的工具,它结构简单、易于理解和操作,不仅可以解决复杂的数位问题,还大大提高了代码的效率。当然,效果的好坏往往取决于状态转移方程的设计,这需要良好的数学基础与实践技能。

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

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

相关文章

【fiddler】fiddler抓取websocket

1.先了解websocket流 下载4.5版本以上的fiddler 如图所示&#xff1a;在rules--customize rules 里面插入以下代码&#xff1a; static function OnWebSocketMessage(oMsg: WebSocketMessage) { // Log Message to the LOG tab FiddlerApplication.Log.LogString(oMsg.ToStr…

鸿蒙开发下拉选项框在表单递交的处理

下拉选项框 <select name"identity"><option value"0">顾 客</option><option value"1">行 政</option><option value"2" >保 洁</option></select>在表单数据中没有找到identit…

Win11 Docker Desktop下部署springboot jar

1.将springboot程序使用maven package打包出jar。 2.创建dockerfile&#xff0c;为了本地打包时方便&#xff0c;这里的dockerfile有小变动。 # Docker Desktop下部署springboot jar FROM openjdk:8 VOLUME /tmp EXPOSE 8601 ARG JAR_FILEtarget/webflux-hello-0.0.1-SNAPSHO…

全球叉车巨头科朗遭网络攻击,工厂生产被迫中断

科朗员工们表示&#xff0c;本次事件最令人沮丧的是公司缺乏透明度和沟通意愿。 起初&#xff0c;员工被告知如果想在缺勤日获得报酬&#xff0c;需要申请失业或使用已积存的带薪休假和年假。 然而&#xff0c;外媒BleepingComputer得知&#xff0c;这一政策有所改变&#xf…

2024年7月计划(ue5肉鸽视频完成)

试过重点放在独立游戏上&#xff0c;有个indienova独立游戏团队是全职的&#xff0c;由于他们干了几个月&#xff0c;节奏暂时跟不上&#xff0c;紧张焦虑了。五一时也有点自暴自弃了&#xff0c;实在没必要&#xff0c;按照自己的节奏走即可。精力和时间也有限&#xff0c;放在…

AVL树插入详解

1.什么是AVL树 二叉搜索树可以提高搜索的效率&#xff0c;但是如果数据有序或者接近有序&#xff0c;就会退化为单边树&#xff0c;查找效率相当于在顺序表中查找数据&#xff0c;时间复杂度会退化到O(n)。AVL树解决了这个问题&#xff0c;通过保证每个节点的左右子树高度之差…

重学java 83.Java注解

As a failure,I met my last sound. —— 24.6.24 一、注解的介绍 1.引用数据类型: 类、数组、接口、枚举、注解 jdk1.5版本的新特性 一个引用数据类型 和类,接口,枚举是同一个层次的 引用数据类型:类、数组、接口、枚举、注解 2.作用: ① 说明&#xff1a;对代码进行说明,生…

elementui组件库实现电影选座面板demo

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Cinema Seat Selection</title><!-- 引入E…

华为、H3C交换机常用巡检命令

一、硬件状态、IOS版本信息检查 • display clock&#xff1a;显示系统时间。 • display version&#xff1a;查看交换机的版本信息和最近一次重新启动的时间。 • display enviroment&#xff1a;显示设备温度。 • display device&#xff1a;显示单板运行状态。 • di…

论文伪代码Latex参考

模版1 \documentclass{article} \usepackage{algorithm} \usepackage{algpseudocode}\begin{document}\begin{algorithm} \caption{AST Pruning Algorithm} \begin{algorithmic}[1]\State $F_k \gets \text{false}$, $F_f \gets \text{false}$, $T \gets R$ \Comment{Initial …

前端中的深拷贝

第1部分&#xff1a;引言 深拷贝&#xff1a;前端开发的隐形守护者 在前端开发的世界里&#xff0c;数据的传递和状态的管理是构建用户界面的基础。然而&#xff0c;数据的复制常常被忽视&#xff0c;直到它引发bug&#xff0c;我们才意识到它的重要性。深拷贝&#xff0c;这…

122.网络游戏逆向分析与漏洞攻防-邮件系统数据分析-邮件物品箱的管理

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果&#xff0c;代码看不懂是正常的&#xff0c;只要会抄就行&#xff0c;抄着抄着就能懂了 内容…

【论文精读】ViM: Out-Of-Distribution with Virtual-logit Matching 使用虚拟分对数匹配的分布外检测

文章目录 一、文章概览&#xff08;一&#xff09;问题来源&#xff08;二&#xff09;文章的主要工作&#xff08;三&#xff09;相关研究 二、动机&#xff1a;Logits 中缺失的信息&#xff08;一&#xff09;logits&#xff08;三&#xff09;基于零空间的 OOD 评分&#xf…

你还在手动操作仓库?这款 CLI 工具让你效率飙升300%!

前言 作为一名开发者&#xff0c;我经常会在 GitHub 和 Gitee 上 fork 各种项目。时间一长&#xff0c;这些仓库就会堆积如山&#xff0c;变成了“垃圾仓库”。每次打开代码托管平台&#xff0c;看到那些不再需要的仓库&#xff0c;我的强迫症就会发作。手动一个一个删除这些仓…

统计学三学习笔记

一&#xff0c;t分布 二&#xff0c;置信区间 最终要用② n越大&#xff0c;s越小&#xff0c;置信区间越小 三&#xff0c;配对样本t检验 假如有两个族群&#xff1a;

Android 2ndBLE的实现

没有需求创造需求 有没有想过一件事情&#xff0c;假如你的手机关机了&#xff0c;而且在家里怎么都找不到的情况&#xff1f; 那么通过另外一种手机进行查找是不是可以&#xff1f;听上去有点搞笑&#xff0c;但实际上确实有这样的需求存在。实现方案是用超低功耗蓝牙&#…

一文弄懂window

iframeDoc.write(<div> printContent </div>);setTimeout(function(){iframe.contentWindow.print();document.body.removeChild(iframe);}, 50);} </script>## 三、强行插入分页当需要自定义打印分页时机时&#xff0c;可通过如下方式将指定 DOM 设为分割…

【Godot4自学手册】第四十二节实现拖拽进行物品交换和数量叠加

这一节我们主要学习背包系统中的物品拖拽后&#xff0c;物品放到新的位置&#xff0c;或交换物品位置&#xff0c;如果两个物品属于同一物品则数量相加。具体效果如下&#xff1a; 一、修改item.tscn场景 给item.tscn场景的根节点Item添加Label子节点&#xff0c;命名为Numv…

vue3基于axios配置请求拦截器响应拦截器以及无感刷新token的实现

vue3基于axios配置请求拦截器响应拦截器以及无感刷新token的实现 一、下载并引入 axios二、引入 element-plus 消息提示三、配置基础地址四、创建 axios 实例五、配置请求拦截器六、定义是否刷新 token 的变量以及存储请求队列的数组七、配置响应拦截器以及实现无感刷新 token八…

Linux CentoS安装RabbitMQ:一键安装指南

有两种安装方法&#xff0c;官方推荐使用 docker安装RabbitMQ 一、Docker安装RabbitMQ 1、安装docker 参考我之前的文章&#xff1a;Centos7.5搭建docker并且部署Lnmp环境&#xff08;小白入门docoker&#xff09;_centos7.5安装docker和docker-compose-CSDN博客 2、安装Ra…