动态规划算法-案例

贪心算法 vs 动态规划:5个经典案例带你理解差异 我们的目的是让大家清晰地理解贪心算法和动态规划这两种算法的区别。为了达到这个目的,我们会用5个经典案例来进行详细说明,从基础概念到实际应用,全面覆盖这两种算法的相关知识。本文首先会介绍一些必要的术语,接着引入核心概念,通过故事和比喻让大家轻松理解贪心算法和动态规划。然后用Python代码详细讲解算法原理和操作步骤,还会给出数学模型和公式。之后通过5个经典案例进行项目实战,包括开发环境搭建、源代码实现和解读。再探讨它们的实际应用场景、推荐相关工具和资源,分析未来发展趋势与挑战。 阅读详情

动态规划的关键点:一系列以空间换时间的算法

tips1:有n级台阶,一个人每次上一级或者两级,问有多少种走完n级台阶的方法。

解析:动态规划的实现的关键在于能不能准确合理的用动态规划表来抽象出 实际问题。在这个问题上,我们让f(n)表示走上n级台阶的方法数。那么当n为1时,f(n) = 1,n为2时,f(n) =2,就是说当台阶只有一级的时候,方法数是一种,台阶有两级的时候,方法数为2。那么当我们要走上n级台阶,必然是从n-1级台阶迈一步或者是从n-2级台阶迈两步,所以到达n级台阶的方法数必然是到达n-1级台阶的方法数加上到达n-2级台阶的方法数之和。即f(n) = f(n-1)+f(n-2),我们用dp[n]来表示动态规划表,dp[i],i>0,i<=n,表示到达i级台阶的方法数。

到达n级台阶的方法数必然是到达n-1级台阶的方法数加上到达n-2级台阶的方法数之和。即f(n) = f(n-1)+f(n-2)

/*dp是全局数组,大小为n,全部初始化为0,是题目中的动态规划表*/
int fun(int n){
	if (n==1||n==2)
		return n;
	/*判断n-1的状态有没有被计算过*/
	if (!dp[n-1])
		dp[n-1] = fun(n-1);
	if(!dp[n-2])
		dp[n-2]=fun(n-2);
	return dp[n-1]+dp[n-2];
}

tips2:给定数组arr,返回arr的最长递增子序列的长度,比如arr=[2,1,5,3,6,4,8,9,7],最长递增子序列为[1,3,4,8,9]返回其长度为5.

分析:首先生成dp[n]的数组,dp[i]表示以必须arr[i]这个数结束的情况下产生的最大递增子序列的长度。对于第一个数来说,很明显dp[0]为1,当我们计算dp[i]的时候,我们去考察i位置之前的所有位置,找到i位置之前的最大的dp值,记为dpj,dp[j]代表以arr[j]结尾的最长递增序列,而dp[j]又是之前计算过的最大的那个值,我们在来判断arr[i]是否大于arr[j],如果大于dp[i]=dp[j]+1.计算完dp之后,我们找出dp中的最大值,即为这个串的最长递增序列。

每次max=dp[j]都指的是前一次的最大值 例如 i=1 j只能等于0 此时max=0 dp[j]=1(如果没有if(dp[j]>_max&&arr[i]>arr[j]),即后面的数大于前面的数 就没有max=dp[j] )那么即使 dp[i]=max+1 也仍然使最长子序列为1
每次进入循环都会清零max 当i=3时 可以取的值有 0 1 2 只要arr[i]>arr[j] 最长子序列势必会增一个
每次dp[j]>_max&&arr[i]>arr[j]不符合条件就会使max仍然继承上次的值 max=0 第一次成立 max=1;dp[i]=2
第二次如果不成立,max=1仍然 此时dp仍然等于2 (0 2 1类似于这种

#include <iostream>
#include <algorithm>
using namespace std;
/*动态规划表*/
int dp[5] = {};
int main(){
	int arr[5] = {2,4,5,3,1};
	dp[0] = 1;

 1. List item

	const int oo = 0;
	for (int i = 1;i<5;i++){
		int _max = oo;
		for (int j=0;j<i;j++)
			if(dp[j]>_max&&arr[i]>arr[j])
				_max = dp[j];
		dp[i] = _max+1;
	}
	int maxlist=0;
	for (int i = 0; i < 5;i++)
		if (dp[i] > maxlist)
			maxlist=dp[i];
	cout << maxlist << endl;
}
、

tips3:背包问题,动态规划经典问题,一个背包有额定的承重W,有N件物品,每件物品都有自己的价值,记录在数组V中,也都有自己的重量,记录在数组W中,每件物品只能选择要装入还是不装入背包,要求在不超过背包承重的前提下,选出的物品总价值最大。
分析:分析:假设物品编号从1到n,一件一件的考虑是否加入背包,假设dp[x][y]表示前x件物品,不超过重量y的时候的最大价值,枚举一下第x件物品的情况:

情况1:如果选择了第x件物品,则前x-1件物品得到的重量不能超过y-w[x]。

情况2:如果不选择第x件物品,则前x-1件物品得到的重量不超过y。

所以dp[x][y]可能等于dp[x-1][y],也就是不取第x件物品的时候,价值和之前一样,也可能是dp[x-1][y-w[x]]+v[x],也就是拿第x件物品的时候,当然会获得第x件物品的价值。两种可能的选择中,应该选择价值较大的那个,也就是:

                        dp[x][y] = max{dp[x-1][y],dp[x-1][y-w[x]]+v[x]}

m[i][j]=max(m[i-1][j],m[i-1][j-w[i]]+v[i]);当碰到一个需要选择的时候有两种可能 1.即将拿的这个物品的重量大于我的背包重量,选择不拿2.即将拿的物品小于我的背包重量,此时考虑拿这件物品和不拿这件物品哪个价值更大((1)不拿 (2)拿同时考虑 当前重量的价值 加上背包重量减去重量的价值

#include <iostream>
#include <cstring>
using namespace std;
 
 
const int N=15;
 
 
int main()
{
    int v[N]={0,8,10,6,3,7,2};
    int w[N]={0,4,6,2,2,5,1};
 
 
    int m[N][N];
    int n=6,c=12;
    memset(m,0,sizeof(m));
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=c;j++)
        {
            if(j>=w[i])
                m[i][j]=max(m[i-1][j],m[i-1][j-w[i]]+v[i]);
 
 
            else
                m[i][j]=m[i-1][j];
        }
    }
 
 
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=c;j++)
        {
            cout<<m[i][j]<<' ';
        }
        cout<<endl;
    }
 
 
    return 0;

}

tips4:
给定一个矩阵m,从左上角开始每次只能向右走或者向下走,最后达到右下角的位置,路径中所有数字累加起来就是路径和,返回所有路径的最小路径和,如果给定的m如下,那么路径1,3,1,0,6,1,0就是最小路径和,返回12.

1 3 5 9

8 1 3 4

5 0 6 1

8 8 4 0

分析:分析到达某个点只需判断它是是左过来还是从右过来更优就可以了





#include <iostream>
#include <cstdio>
#include <algorithm>
 
using namespace std;
 
int value[1024][1024];
 
int main()
{
	int m, n;
	scanf_s("%d%d", &m, &n);
 
	//输入矩阵
	for (int i = 0; i < m; ++i)
	{
		for (int j = 0; j < n; ++j)
		{
			scanf_s("%d", &value[i][j]);
		}
	}
 
	//计算
	for (int i = 1; i < m; ++i)
	{
		value[i][0] += value[i - 1][0];
	}
	for (int j = 1; j < n; ++j)
	{
		value[0][j] += value[0][j - 1];
	}
	for (int i = 1; i < m; ++i)
	{
		for (int j = 1; j < n; ++j)
		{
			value[i][j] += max(value[i - 1][j], value[i][j - 1]);
		}
	}
 
	////打印调试
	//for (int i = 0; i < m; ++i)
	//{
	//	for (int j = 0; j < n; ++j)
	//	{
	//		cout << value[i][j] << " ";
	//	}
	//	cout << endl;
	//}
	//cout << endl;
 
	cout << value[m - 1][n - 1] << endl;
 
	return 0;
}

【数据结构与算法】三个经典案例带你了解动态规划 首先知道物品3的重量为4,因此在背包容量小于4时,我们无法放入物品3,那么我们还需要考虑的就有物品1和物品2,从上一步骤得知,物品2的最大收益时在考虑了物品1的基础上得出的,因此我们只需要考虑放入物品2的最大收益即可,那么此时的最大收益就等于在当前背包容量下,放入物品2的最大收益;,所以我们找到物品3在背包容量等于3情况下最大收益对应的格子,同样判断一下上一种物品(物品2)的最大收益是否等于此格子中的最大收益,当前判断为相等,因此我们没有放入物品3。很明显,当背包容量为0时,我们能获得的最大收益一定为0; 阅读详情

相关推荐

贪心算法 vs 动态规划:5个经典案例带你理解差异_副本

本文旨在帮助读者理解贪心算法和动态规划的核心差异,通过具体案例展示两种算法的适用场景和实现方式。我们将覆盖从基础概念到实际应用的完整知识链。核心概念与联系:介绍贪心算法和动态规划的基本概念算法比较:通过5个经典案例对比两种算法实际应用场景:讨论两种算法在现实问题中的应用总结与思考:归纳关键差异并提供进一步思考的方向贪心算法(Greedy Algorithm):在每一步选择中都采取当前状态下最优的选择,希望这样能导致全局最优解。动态规划(Dynamic Programming)

AI 算法实战派 593

动态规划十大经典案例(Dynamic Programming Practice Problems)

动态规划(Dynamic Programming)是求多阶段决策过程(Multistep Decision Process)最优化的一种数学方法,它将问题的整体按时间或空间的特征分成若干个前后衔接的时空阶段,把多阶段决策问题表示为前后有关的一系列单阶段决策问题,然后逐个求解,从而求出整个问题的最有决策序列。它强调了时间和空间的连续性。 如果没有基础知识,建议参看关文忠教授(退休)的运筹学课程中了...

mr2zhang的博客 7339

动态规划算法与典型应用案例分析

动态规划是一种将问题分解为更小的子问题,并且通过解决这些子问题来求解原问题的方法。其核心在于存储子问题的解,避免重复计算,以达到高效解决问题的目的。最长上升子序列(Longest Increasing Subsequence,简称LIS)问题是计算机科学和数学中常见的问题,其核心内容是在给定的序列中找到一个最长的上升子序列。一个子序列可以由序列中不连续的元素构成,但需保持原有元素的相对顺序不变。

weixin_42181686的博客 359

【数据结构与算法-动态规划系列经典例题汇总】

【数据结构与算法-动态规划系列经典例题汇总】典例1、爬楼梯(easy)典例2、打劫(easy)典例3、最大字段和(easy)典例4、找零钱(medium)典例5、三角形(medium)典例6、最长上升子序列(medium)典例7、最小路径和(medium)典例8、地下城游戏(hard) 典例1、爬楼梯(easy) 题目描述: 思路: LeetCode提交OJ测试链接: OJ测试代码实现: 可本地运行测试的完整代码: 典例2、打劫(easy) 题目描述: 思路:

是小武呀 1万+

WPS接入DeepSeek,实现AI辅助功能

总的来说,借助 WPS 中宏功能与 DeepSeek 大模型的结合,文档处理、内容创作和数据分析等任务都能更加智能化、自动化。这不仅大幅提升了工作效率,也为办公场景带来了全新的智能化办公体验。

运维老生常谈 3805

OpenCV实战:从边缘检测到透视校正,打造智能文档扫描仪(Python代码详解)

本文详细介绍了如何使用OpenCV和Python从零开始构建一个智能文档扫描仪。通过边缘检测、透视校正和文字增强等核心技术,将倾斜、模糊的文档照片转换为清晰、方正的高质量扫描图像。文章提供了完整的代码实现和参数调优经验,帮助开发者打造稳定、高效的文档处理工具。

flower的专栏 695

动态规划算法的例子

如果是计算及科班出身的话,动态规划可能已经听过,研究生的课程和本科生的课程的区别在于采用的教材难度更加大一些。更强调一些经典问题和在此基础上升级的问题。动态规划和分治算法有很多地方是相像的。 一、引子 1、最短路径问题 问题: 输入:起点集合S1,S2,...,Sn,终点集合T1,T2,...,Tm,起点集合 { S_1, S_2, ..., S_n } , 终点集合{T_1, T_2, ... , T_m}, 起点集合S1​,S2​,...,Sn​,终点集合T1​,T2​,...

极客园地 5239

逆向分析美团外卖mtgsig3.0签名算法:从抓包到算法还原实战

在移动应用开发与安全领域,API接口签名是保障数据传输完整性与身份验证的核心机制。其基本原理是通过特定的算法,将请求参数、时间戳等数据与密钥结合,生成唯一的签名串,服务器通过验证签名来识别请求的合法性。这项技术的核心价值在于防止数据篡改、重放攻击和未授权访问,是构建安全客户端-服务器通信的基石。在实际应用中,签名算法广泛应用于电商、社交、金融等各类App的接口保护场景。本文以美团外卖App的mtgsig3.0签名为具体案例,详细拆解了其生成逻辑。通过结合Frida动态调试与Jadx静态分析,文章深入探讨了如

weixin_29325515的博客 1246

动态规划常见实例详解

首先很多人问,何为动态规划?动态规划(DynamicProgramming,DP)是运筹学的一个分支,是求解决策过程最优化的过程。通俗一点动态规划就是从下往上(从前向后)阶梯型求解数值。那么动态规划和递归有什么区别和联系?总的来说动态规划从前向后,递归从后向前,两者策略不同,并且一般动态规划效率高于递归。不过都要考虑初始状态,上下层数据之间的联系。很多时候用动态规划能解决的问题,用递归也能解决不过很多时候效率不高可能会用到记忆化搜索。不太明白?实现记忆化搜索求斐波那契代码为return1;......

qq_45228323的博客 5272

【S32K】S32K144入门笔记(4) Lin (Lin stack组件) 驱动超声波雷达实例

0. 引言 Lin这块是我一直没弄懂的部分。很多东西一知半解,当时感觉是硬凑了答案出来。 果然过标的时候出了问题,几个小伙伴帮忙一起刷夜也没搞定,好在标还是顺利过了,不然罪过大了。 之前做lin这块一直用的是linStack组件,这部分包含了协议栈部分,需要对lin的协议比较清楚和理解才好配置。 尤其是,图形界面配置完成后会生成一个ldf文件,这个文件很重要,所有的代码都是基于这个文件生成的,但是这个文件我确认没找到什么介绍资料,所以很多配置都是一点一点凑出来的,再实际验证的。 抓住这次写文档的机会,把当时

YoYo的桃子树 1万+

SV--对象拷贝、参数化的类

对象拷贝,参数化的类

创芯人--fly的博客 1570

动态规划算法与典型例题

动态规划算法设计思路与一些典型例题,如长江游艇问题,0-1背包问题,跳台阶问题,强盗抢劫问题等

weixin_50431732的博客 1万+

silvaco——GaN HEMT探索

上图为输出特性曲线 ,分别是在栅压为1v、3v、5v的情况下,可以看出在1v时器件处于截止状态,只有非常小近似于0的电流通过,随着栅压逐渐增大,沟道开启,产生漏极电流。上图为栅极漏电流曲线和转移特性曲线以及其提取的参数,可以看到阈值电压为=1.30249V,当栅压为0v时,Id=8.01032e-006,当栅压为5V时,Ig=3.11627e-006。albrct.n,低场迁移率模型,bn.albrct,an.albrct是albrct模型中的参数,可以由用户自己设定。lat.temp,晶格自热模型;

weixin_61913839的博客 7617

动态规划算法经典案例

转载自:https://blog.youkuaiyun.com/uestclr/article/details/50760563 动态规划算法是从暴力搜索算法优化过来的,如果我们不清楚暴力搜索的过程,就难以理解动态规划的实现,当我们了解了动态规划算法的基本原理的文字概述,实现条件之后,这时可能并不是太理解这种思想,去面对实际问题的时候也是无从下手,这个时候我们不能停留在文字层面上,而应该去学习经典动态规划...

realzuile的博客 1万+

YOLO11 锚框机制全解析:从改进 K-means 聚类到自适应优化,附多场景实战(附代码)

摘要 YOLO11的锚框机制采用"自适应、动态化、场景感知"的设计理念,通过数据驱动的锚框生成、多尺度感知分配和实时优化策略,显著提升目标检测性能。相较于早期YOLO版本,YOLO11的锚框完全基于训练集目标分布自适应生成,并引入智能分配策略,使不同尺寸目标获得最优匹配。技术架构包含自适应锚框生成、多尺度分配器和动态优化模块,通过改进的K-means聚类和交并比计算实现精准匹配。YOLO11锚框机制在检测精度、训练稳定性和场景适应性方面均有显著提升,为复杂场景下的目标检测提供更优解决方案

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1321

手把手教你学simulink(36.1)--ACAC变换器场景示例:基于 Simulink 的矩阵变换器(Matrix Converter)

矩阵变换器(Matrix Converter, MC)是一种直接将交流电(AC)转换为不同频率和幅值的交流电的电力电子设备。与传统的基于直流环节的变频器不同,矩阵变换器不需要中间的直流环节,而是通过双向开关直接在输入和输出之间进行能量传递。这种结构使得矩阵变换器具有更高的效率、更小的体积和更好的动态响应。在本项目中,我们将使用 MATLAB/Simulink 来建模和仿真一个矩阵变换器,并分析其性能。Simulink 是一个强大的仿真工具,特别适合用于电力电子系统的建模和仿真。

MHD0815的博客 1066

Python动态规划算法实战案例

本文探讨了Python动态规划算法的实战应用。动态规划通过分解问题为子问题并存储最优解来提高效率,适用于复杂优化问题。文中分析了三个典型案例:1)房价优化中动态规划表确定最佳定价策略;2)机器学习数据处理中的降维和特征选择优化;3)物流配送路线优化。实践表明,要充分发挥该算法优势,需要深入理解原理、做好案例分析和制定针对性优化策略。Python动态规划算法凭借其高效性和灵活性,成为解决各类实际问题的有力工具。

searchboy2025的博客 108

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

玩转python: 动态规划算法(python案例)

动态规划(Dynamic Programming,简称DP)是一种在数学、计算机科学和经济学中使用的方法,它通过将复杂的问题分解为更小的子问题来解决。动态规划算法的核心思想是解决每个子问题一次,并保存子问题的解以避免重复计算,从而提高算法效率。本文将用通俗易懂的方式介绍动态规划算法,并通过Python代码案例进行说明。动态规划的基本思想:动态规划的基本思想是将一个复杂的问题分解成若干个相互重叠的子问题,通过求解子问题来递推地求解原问题。动态规划算法的关键在于找到问题的最优子结构和重叠子问题。

Luckstar2019的博客 508

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Java算法之动态规划基本思想以及具体案例

动态规划

zy512638348的博客 856

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

动态规划算法原理及案例

参考链接:https://www.cnblogs.com/huststl/p/8664608.html 动态规划基本概念 定义:动态规划的意义就是通过采用递推(或者分而治之)的策略,通过解决大问题的子问题从而解决整体的做法。动态规划的核心思想是巧妙的将问题拆分成多个子问题,通过计算子问题而得到整体问题的解。而子问题又可以拆分成更多的子问题,从而用类似递推迭代的方法解决要求的问题。 基本思想:...

软件工程 1351

python实现动态规划,python实现动态规划算法案例

动态规划算法的思想:把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解。动态规划一般可分为线性动规,区域动规,树形动规,背包动规四类。线性动规:拦截导弹,合唱队形等;区域动规:石子合并, 统计单词个数,炮兵布阵等;树形动规:二分查找树,数字三角形,三角树塔等;背包问题:01背包问题,完全背包问题,等;经典动态规划算法举例:1.三角树塔问题。问题描述:设有一个三角形的数塔。顶点为根结...

weixin_42348026的博客 1974

动态规划算法详解及案例讲解

动态规划三大步骤应对Leecode

m0_73548013的博客 226

算法设计与分析案例代码总结(二):动态规划

动态规划  动态规划是一种使多阶段决策过程最优的通用方法。与分治法类似,其思想把求解的问题分成许多阶段或多个子问题,然后按顺序求解各子问题。但动态规划中分解得到的子问题往往不是相互独立的,但不同子问题的数目常常只有多项式级。所以在动态规划中,我们要保留已解决子问题的解,避免大量重复计算,从而提升算法效率。  以下是各种案例的原理代码总结: 矩阵连乘问题 问题描述: 给定n个矩阵{A1,A2,…,A...

zycode1561的博客 670
上一篇: C语言深入解析-关键字
下一篇: 弗洛伊德算法求最短路径
Azuresmh
博客等级 码龄9年 176粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值