闫式Dp分析法(一种求解动态规划问题的思路)

        最近一直跟着Acwing学习动态规划问题的求解思想,感觉晦涩的算法问题一旦经过闫式Dp分析法的剖析,瞬时迎刃而解,故今天我觉得很有必要再次分享一下闫式Dp分析法(在此默认你对DP问题有了一定的了解)

闫式Dp分析法

        闫式Dp分析法包含了问题的状态表示与状态的计算,其中状态表示又可以细分为集合的定义以及集合的属性,而动态规划问题的最终答案就是最终所求集合的属性。

     


        总所周知,解决DP问题一般需要定义一个二维数组f,而f的每一项f(i,j)在闫式Dp分析法中蕴含着丰富的意义。其中,集合的定义与坐标i与j之间存在直接联系,而f(i,j)的值就是该集合的属性。状态的计算脱离不了集合的划分,其中f(i,j)对应的集合set将会划分为若干个子集合set_{i},其中

        set = \bigcup (set_{i}) \; \; and \; set_{i} \bigcap set_{j} = \emptyset \; (i!=j)

        概念都是抽象的,下面我举出一个经典的Dp入门问题01背包问题的案例,并借助闫式Dp分析法解决它,以便让读者有更加深刻的理解.


案例分析

        在阅读下面案例分析内容时,默认读者已对问题有基本了解,不再做任何问题的描述.

01背包问题

        01背包问题给出N件物品何一个容量为V的背包,在每一件物品都只能使用一次的情况下,考虑一种物品的装载方案,求算出容量为V的背包所能装载物品的最大价值(每一个物品都有一个对应的价值和体积).

        直接定义二维数组f,那么我们可以这样子定义状态的表示,其中f(i,j)状态对应的集合含义为:在只考虑选择前i个物品的情况下将前i个物品中的若干个装入背包使其容量之和小于或等于j的所有方案.该集合的数学表示为:set = \{set_1,set_2,...,set_{i},...\}.

        其中set_{i}表示其中一种物品装入背包的方案,与此同时,假设obj_{i},v_{i}分别表示第i物品与第i个物品的体积,那么任意一个set_{i} = \{obj_{k}|1<=k \; and \; k<=i \; and \sum_{k=1}^{i}(v_{k})<=j \}.

        f(i,j)表示集合某一个属性,在01背包问题中,f(i,j)表示集合中某一个元素中所有物品之和的最大值。看起来有点抽象,但是f(i,j)有如下数学公式,其中m_{k}表示第k个物品的价值:                                          f(i,j) = max \sum m_{k},m_{k} \in set_{i}

        最后,我们来划分一下f(i,j)对应的集合,其实很简单。由于每一个物品只能选一次,只存在选与不选两种方案,因此集合可以划分为set_{k}包含第i个物品或者set_{k}不包含第i个物品.f(i,j)表示集合中某一个元素中所有物品之和的最大值,因此f(i,j)的推导公式如下:f(i,j) = max(f(i-1,j),f(i-1,j-v_{i})+m_{i})

        最后,01背包问题的最终答案就是f(N,V)!

        好了,01背包问题的闫式Dp分析法到此为止便结束了,还有更多的DP问题都能够通过闫式Dp分析法来解决。毕竟,闫式Dp分析法在大部分情况下还是很好用的,它的难点在于如何定义集合,要求集合与二维数值下标(i,j)建立起联系,与此同时要定义集合的属性,属性往往与问题的答案相互挂钩,最后是将集合划分,推算出集合属性与它的子集合属性之间的数学公式,建立起递推方程.

写在最后

        阅读完上述的闫式Dp分析法后,倘若你有所领悟,你便能发现动态规划之所以省时间的原因是,它优化了暴力解决方法。

        倘若使用暴力方法求解背包问题,那么由于一共有2^{N}种物品的组合方案(每种物品有选与不选两种选择),对于每一个方案需要求算它的体积之和以及价值之和,那么总共的时间复杂度为O(N*2^{N}).这个是一个很糟糕的时间复杂度,即使N = 1000,暴力解法的计算次数已经高达10^{303}次。一般电脑C++每秒求算10^{7}~10^{8},

即该问题基于暴力解法的最好求算时间是10^{295}秒,大概是10^{280}亿年!!!是不是大为震撼,地球诞辰以来还不需要如此长的时间,倘若真的使用暴力解法来求算背包问题,恐怕要计算到宇宙爆炸,你的生命等不来,甚至连人类社会都等不来,哈哈!然而,倘若使用动态规划算法来求解,只需要1s,两种算法之间需要存在天壤之别!

        之所以举出上述对比案例,并非平白无故,是为了让你能够感受到动态规划算法的威力,让你艰辛的动态规划算法的学习之旅不再枯燥,你将带着一种仰望的姿态来学习这种优美的、威力十足的算法!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端问题记录

jenkins安装vue依赖报错 jenkins 安装依赖&#xff0c;报错cannot find module ‘/root/.jenkins/workspace/项目路径/node_modules/xxxx’&#xff0c;如图上 解决&#xff1a;执行 npm install vue/cli-service --unsafe-perm&#xff0c;再执行npm i

你以为出现NoClassDefFoundError错误会是什么原因?

你以为出现NoClassDefFoundError错误会是什么原因&#xff1f; 1、概述2、事情经过3、总结 1、概述 大家好&#xff0c;我是欧阳方超&#xff0c;可以关注我的公众号“欧阳方超”&#xff0c;后续内容将在公众号首发。 同样的错误&#xff0c;非一样的解决方式。NoClassDefFou…

【sgDragUploadFolder】自定义组件:自定义拖拽文件夹上传组件,支持上传单个或多个文件/文件夹,右下角上传托盘出现(后续更新...)

特性&#xff1a; 支持在拖拽上传单个文件、多个文件、单个文件夹、多个文件夹可自定义headers可自定义过滤上传格式可自定义上传API接口支持显示/隐藏右下角上传队列托盘 sgDragUploadFolder源码 <template><div :class"$options.name" :dragenter"i…

使用Gitee中的CI/CD来完成代码的自动部署与发布(使用内网穿透把本地电脑当作服务器使用)

&#x1f4da;目录 &#x1f4da;简介:⚙️ 所需工具&#xff1a;&#x1f4a8;内网穿透配置&#x1f4ad;工具介绍✨命令安装&#x1f38a;配置Cpolar&#x1f573;️关闭防火墙&#x1f95b;防火墙端口放行规则&#xff08;关闭防火墙可以忽略&#xff09;&#x1f36c;小章总…

WCF服务总结

前言 WCF,全称为Windows Communication Foundation,是一种用于构建分布式应用程序的微软框架。它提供了一种统一的编程模型,用于构建服务导向的应用程序,这些应用程序可以在本地或远程计算机上运行。WCF 支持多种传输协议和编码格式,并提供了高级安全性、可靠性和事务处理…

微软在 Perforce Helix 核心服务器中发现4个安全漏洞

微软分析师在对Perforce Helix的游戏开发工作室产品进行安全审查时&#xff0c;发现为游戏、政府、军事和技术等部门广泛使用的源代码管理平台 Perforce Helix Core Server 存在四大漏洞&#xff0c;并于今年 8 月底向 Perforce 报告了这些漏洞&#xff0c;其中一个漏洞被评为严…

路径规划之RRT *算法

系列文章目录 路径规划之Dijkstra算法 路径规划之Best-First Search算法 路径规划之A *算法 路径规划之D *算法 路径规划之PRM算法 路径规划之RRT算法 路径规划之RRT *算法 路径规划之RRT*算法 系列文章目录前言一、RRT算法1.起源2.改进2.1 重新选择父节点2.2 重新布线 3.对比…

day44代码训练|动态规划part06

完全背包和01背包问题唯一不同的地方就是&#xff0c;每种物品有无限件。 1. dp数组的含义 dp[i][j] 0-i物品&#xff0c;重量为j的容量时&#xff0c;最大的价值 2. 递推公式 dp[i][j] max(dp[i-1][j],dp[i][j-weight[i]]value[i]); 两种状态&#xff0c;不用物品i的话&…

【数论】质数

试除法判断质数 分解质因数 一个数可以被分解为质因数乘积 n &#xff0c;其中的pi都是质因数 那么怎么求pi及其指数呢&#xff1f; 我们将i一直从2~n/i循环&#xff0c;如果 n%i0&#xff0c;那么i一定是质因数&#xff0c;并且用一个while循环将n除以i&#xff0c;一直到…

蛇梯棋[中等]

一、题目 给你一个大小为n x n的整数矩阵board&#xff0c;方格按从1到n2编号&#xff0c;编号遵循 转行交替方式 &#xff0c;从左下角开始 &#xff08;即&#xff0c;从board[n - 1][0]开始&#xff09;每一行交替方向。玩家从棋盘上的方格1&#xff08;总是在最后一行、第…

礼品企业网站搭建的作用是什么

礼品一般分为企业定制礼品和零售现成礼品&#xff0c;二者都有很强的市场需求度。同时对礼品企业而言&#xff0c;一般主要以批发为主&#xff0c;客户也主要是零售商或企业。 1、拓客难 不同于零售&#xff0c;即使没有引流&#xff0c;入驻商场或街边小摊也总会有自然客户。…

【C++篇】Vector容器 Vector嵌套容器

文章目录 &#x1f354;简述vector&#x1f384;vector存放内置数据类型⭐创建一个vector容器⭐向容器里面插入数据⭐通过迭代器访问容器里面的数据⭐遍历&#x1f388;第一种遍历方式&#x1f388;第二种遍历方式&#x1f388;第三种遍历方式 &#x1f384;vector存放自定义数…

揭秘 Go 中 Goroutines 轻量级并发

理解 Goroutines、它们的效率以及同步挑战 并发是现代软件开发的一个基本概念&#xff0c;使程序能够同时执行多个任务。在 Go 编程领域&#xff0c;理解 Goroutines 是至关重要的。本文将全面概述 Goroutines&#xff0c;它们的轻量级特性&#xff0c;如何使用 go 关键字创建…

FPGA模块——以太网(1)MDIO读写

FPGA模块——以太网MDIO读写 MDIO接口介绍MDIO接口代码&#xff08;1&#xff09;MDIO接口驱动代码&#xff08;2&#xff09;使用MDIO驱动的代码 MDIO接口介绍 MDIO是串行管理接口。MAC 和 PHY 芯片有一个配置接口&#xff0c;即 MDIO 接口&#xff0c;可以配置 PHY 芯片的工…

Ubuntu 常用命令之 ifconfig 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 ifconfig 是一个用于配置和显示 Linux 内核中网络接口的系统管理命令。它用于配置&#xff0c;管理和查询 TCP/IP 网络接口参数。 ifconfig 命令的参数有很多&#xff0c;以下是一些常见的参数 up&#xff1a;激活指定的网络接口…

Java学习系列(五)

1.继承 继承是java面向对象编程技术的一块基石&#xff0c;因为它允许创建分等级层次的类。 继承就是子类继承父类的特征和行为&#xff0c;使得子类对象&#xff08;实例&#xff09;具有父类的实例域和方法&#xff0c;或子类从父类继承方法&#xff0c;使得子类具有父类相…

实现单链表的基本操作(力扣、牛客刷题的基础笔试题常客)

本节来学习单链表的实现。在链表的刷题中&#xff0c;单链表占主导地位&#xff0c;很多oj题都在在单链表的背景下进行&#xff1b;而且很多链表的面试题都是以单链表为背景命题。所以&#xff0c;学好单链表的基本操作很重要 目录 一.介绍单链表 1.链表及单链表 2.定义一个…

生活中的物理2——人类迷惑行为(用笔扎手)

1实验 材料 笔、手 实验 1、先用手轻轻碰一下笔尖&#xff08;未成年人须家长监护&#xff09; 2、再用另一只手碰碰笔尾 你发现了什么&#xff1f;&#xff1f; 2发现 你会发现碰笔尖的手明显比碰笔尾的手更痛 你想想为什么 3原理 压强f/s 笔尖的面积明显比笔尾的小 …

C#文件操作(二)

一、前言 文章的续作前文是&#xff1a; C#文件操作&#xff08;一&#xff09;-CSDN博客https://blog.csdn.net/qq_71897293/article/details/135117922?spm1001.2014.3001.5501 二、流 流是序列化设备的抽象表示序列化设备可以线性方式储存数据并可按照同样的方式访问一次…

【QT】QGraphicsView和QGraphicsItem坐标转换

坐标转换 QGraphicsItem和QGraphicsView之间的坐标转换需要通过QGraphicsScene进行转换 QGraphicsView::mapToScene() - 视图 -> 场景QGraphicsView::mapFromScene() - 场景 -> 视图QGraphicsItem::mapToScene() - 图元 -> 场景QGraphicsItem::mapFromScene() - 场景 …