动态规划算法(1)

news2024/11/23 22:37:18

认识动态规划

动态规划的求解思路:
1. 把一个问题分解成若干个子问题
2. 将中间结果保存以避免重复计算

基本步骤:
1. 找出最优解的性质,然后刻画结构特征 (找规律)
2. 最优解(最好的解决方案 定义) 循环(递归)
3. 以自上而下或者自下而上的方式来计算最优值(局部的)
4. 通过最优值来构造最优解

走台阶问题

你每次可以走一步或者两步,有n个台阶,请问你可以有多少种不同的走的方案。
规定:可以超过n,例如n=4: 你可以选择这样走: 1+2+2 ,即使最后答案是5

解析:
走台阶问题就是最简单的动态规划的问题:
我们可以将每一次走的过程分解:

一阶台阶,我们总共有两种方案。
二阶台阶,我们有三种方案。…
你有没有发现很熟悉? 这不就是我们的斐波那契数列吗? 1 1 2 3 5 8 …
只不过这个斐波那契数列是从2开始的,然后依次往下走。
在这里插入图片描述

动态规划:

int func1(int n)
{
	if (n == 1 || n == 2)
	{
		return n;
	}
	else
	{
		return func1(n - 1) + func1(n - 2);
	}
}


最短路径问题

求最短路径问题: 有矩阵 map 能且只能两种走法 往下 或者 往右 求最短路径

在这里插入图片描述

注意:我们构造的辅助数组的宽高要比原数组大一,原因:

  • 在我们处理第一行与第一列的时候,第一行往右走;第一列往下走。
  • i== 0 或者 j== 0的时候会出现数组越界,因此必须要单独空出第一行与第一列的空间,在剩下的空间处理原地图

地图数组
int map[4][4]{
	2,3,4,2,
	1,2,6,4,
	5,7,4,1,
	6,5,2,3,
};

//动态规划2:最短路径
void func2()
{
	//1. 准备一个辅助数组
	int tempArr[5][5]{};
	//2. 寻找每一步的最小值,当前最小值累计起来就是最后的最小值
	//即由 局部最优解--->全局最优解
	for (int i = 1; i < 5; i++)
	{
		for (int j = 1; j < 5; j++)
		{
			//第一行:只能从左边过来
			if (i == 1)
			{
				tempArr[i][j] = map[i-1][j-1] + tempArr[i][j - 1];
			}
			//第一列:只能从上边下来
			else if (j == 1)
			{
				tempArr[i][j] = map[i-1][j-1] + tempArr[i - 1][j];
			}
			else
			{
				//分别计算从左边《往右》和从上边《往下》的最小值,寻找局部最优解
				tempArr[i][j] = map[i-1][j-1] + min(tempArr[i][j - 1], tempArr[i - 1][j]);
			}
		}
	}
	printf("地图的最短路径: %d\n", tempArr[4][4]);
}

辅助地图:
在这里插入图片描述

最长上升子串问题

有一串整数数组,1 4 7 2 5 8 3 6 9
求出其最长的上升字串的长度
上升串是这样的:
147 258 369
上升串允许是不连续的: 1 4 7 8 9

我们经过分析,求总的最长的字串,其实就是求每个点之前的最长长度

  1. 使用pMaxlen记录每一个点对应的最长的长度。
  2. 使用pTemp记录用来确定每个点的最长字串长度,每次遍历都从数组头部开始,遍历到对应点为止。
  3. pMaxLen数组记录这个点的最长字串长度,他的值是由pTemp来确定。

在这里插入图片描述

//动态规划3:最长上升字串
void func3()
{
	//1. 预处理
	int len = 0;
	printf("请输入数组长度: ");
	cin >> len;
	int* pBuff = new int[len] {};
	for (int i = 0; i < len; i++)
	{
		cin >> pBuff[i];
	}
	//2. pMaxLen数组
	int* pMaxLen = new int[len] {};

	//pMaxLen数组:第一个元素对应点的最长字串我们初始化为 0
	//第二个元素对应点的最长字串我们初始化为 1,因为他前面就一个字符,我们默认1就是最长的
	pMaxLen[1] = 1;

	//从第三个字符开始遍历
	for (int i = 2; i < len; i++)
	{
		int pTemp = 1;	//从第三个字符开始,所以前面最长的一定是从1开始
		for (int j = 1; j < i; j++)	//在i的前面寻找
		{
			//前面小于后面,满足上升条件,更新pTemp记录长度
			if (pBuff[j] < pBuff[i])
			{
				pTemp = max(pTemp, pMaxLen[j]);
			}
			pMaxLen[i] = pTemp + 1;
		}
	}
	printf("最长上升字串: %d\n", pMaxLen[len - 1]);

	delete[] pBuff;
}

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

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

相关文章

我与梅西粉丝们的世界杯观球日常

世界杯 ⚽️ 期间&#xff0c;我与其他的梅西粉丝在某 APP 里建了个梅粉聊天群&#xff0c;群内人数上万人&#xff0c;大家一起讨论赛事热点&#xff0c;可谓热火朝天&#xff0c;此起彼伏&#xff0c;这是四年一度的狂欢&#xff0c;虽值冬季&#xff0c;但热情不减。 “阿根…

配置设备远程管理—eNSP

案例&#xff1a;给路由器配置远程管理&#xff0c;使一台路由器远程管理另一台。 所需设备&#xff1a;两台路由器&#xff0c;一根网线 图示 一、给两台设备配置IP地址 AR1&#xff08;以下命令&#xff09; a. sy b. int g0/0/0 c. ip add 1.1.1.1 24AR2 a. sy b. int g0/0…

十分钟学完简单工厂,普通工厂,抽象工厂

快速学习简单工厂&#xff0c;普通工厂&#xff0c;抽象工厂前言&#xff1a;产品等级和产品族工厂模式作用简单工厂模式uml代码优缺点普通工厂模式uml代码优缺点抽象工厂模式uml代码优缺点前言&#xff1a;产品等级和产品族 在学习工厂模式之前&#xff0c;先得了解一下产品等…

Redis实践

一、持久化 Redis 的数据 全部存储 在 内存 中&#xff0c;如果 突然宕机&#xff0c;数据就会全部丢失&#xff0c;因此必须有一套机制来保证 Redis 的数据不会因为故障而丢失&#xff0c;这种机制就是 Redis 的 持久化机制&#xff0c;它会将内存中的数据库状态 保存到磁盘 …

Spring——AOP原理及流程详解

AOP原理及流程详解一、AOP结构介绍Pointcut通知原理连接点拦截器二、Bean介入点EnableAspectJAutoProxyAspectJAutoProxyRegistrarAnnotationAwareAspectJAutoProxyCreatorAbstractAutoProxyCreator实例前执行初始化后执行循环依赖会调用总结三、处理切面获取所有切面其下通知方…

国内饮料行业数据浅析

大家好&#xff0c;这里是小安说网控。 饮料一直深得年轻人的宠爱&#xff0c;主要消费品类为饮用水、碳酸饮料、奶制品、气泡水等。刚刚过去的十月份&#xff0c;我国饮料产量当期值1199.6万吨&#xff0c;同比下降6.1%&#xff1b;今年1-10月份&#xff0c;饮料产量累计值157…

这几个点让我买了Watch Ultra

01.凑够Apple 全家桶 MacBook ProiPhoneAirPodsiPad 02.可以解锁iPhone手机&#xff0c;MacBook,iPad 03.当iPhone 来电话&#xff0c;不方便接听&#xff0c;可以使用Watch接听(虽然这种情况挺少) 04.可以连接AirPods 听音乐 05.花10元钱开卡&#xff0c;iPhone和Watch 可以…

前端ES6-ES11新特性

ES6新特性 变量声明 let a; let b,c,d; let e 100; let f 521, g iloveyou, h [];块级作用域 {let girl 周扬青; }console.log(girl); //这里会报错&#xff0c;变量不在作用域内,用var声明就可以常量声明 const NAME tom; //必须赋予初始值&#xff0c;变量名大写&am…

3-7数据链路层-设备

文章目录一.网桥1.基本原理2.透明网桥&#xff08;1&#xff09;工作原理&#xff08;2&#xff09;自学习算法3.源路由网桥二.局域网交换机1.局域网交换机2.原理3.特点4.两种交换模式5.交换机的自学习算法一.网桥 网桥根据MAC帧的目的地址对帧进行转发和过滤。当网桥收到一个…

Java中数组、集合初始化及遍历方式

一、数组 1. 一维数组 一维数组两种初始化方式 静态初始化 int[] array {1,2,3};int[] array new int[]{1,2,3};动态初始化 int[] array new int[3]; array[0]1; array[1]2; array[2]3;一维数组两种遍历方式 普通for循环for (int i 0; i < array.length; i) {System.ou…

全家桶Spring、HikariCP、Mybatis和Oracle配置,你想要的都在这里

目录1、HikariCP配置说明2、spring配置文件里&#xff0c;配置HikariCP数据库连接池3、注意连接池大小设置&#xff0c;重点推荐官方说明文档4、HikariCP配置5、数据库配置文件1、HikariCP配置说明 HikariCP: https://github.com/brettwooldridge/HikariCP 2、spring配置文件…

毕业设计-机器学习人眼检测活体检测-opencv

目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科…

视效剧情口碑双爆棚!Netflix 现象级剧集《怪奇物语》第四季神级视效专访大揭秘!

刷新 Netflix 收视记录的超火剧集《怪奇物语》&#xff08;Stranger Things&#xff09;第四季视效剧情口碑双爆棚&#xff0c;无疑是2022年最值得一看的现象级剧集之一。第四季共九集&#xff0c;分上下两部&#xff0c;分别在今年5月和7月上线&#xff0c;目前豆瓣评分已经稳…

分享知识付费系统变现的方式_知识付费系统开发步骤

一、知识付费赚钱的方式 首先给大家讲讲知识付费赚钱的两大方式&#xff0c;大家可以根据自己的情况来选择做哪种。 1、自己做知识付费赚钱 自己做知识付费需要自己有一套成熟的理念观点&#xff0c;能输出成优质的内容传授给他人。可以将自己的知识技能制作成音频、视频、图…

【Python】三、内置函数

文章目录实验目的一、abs()二、int() / float() / str() / pow()1、int()2、float()3、str()4、pow()三、len() / id() / type()1、len()2、id()3、type()四、编写程序&#xff0c;实现输入一个正的实数x&#xff0c;分别输出x的整数部分和小数部分。1.设计思路2.设计算法3.参考…

南芯科技在科创板提交注册:业绩增速迅猛,股东包括红杉、顺为等

近日&#xff0c;上海南芯半导体科技股份有限公司&#xff08;下称“南芯科技”&#xff09;在上海证券交易所科创板递交招股书&#xff08;注册稿&#xff09;。据贝多财经了解&#xff0c;南芯科技于2022年6月21日在科创板递交上市申请&#xff0c;11月18日获得上市委会议通过…

堆(堆排序和模拟堆)

如何手写一个堆 下标从1开始&#xff0c;如果从0开始的话&#xff0c;他的左儿子的下标就等于0*2 0&#xff0c;麻烦 手写堆可以实现的操作&#xff1a;1&#xff0c;插入一个数 2&#xff0c;求集合当中的最小值 3&#xff0c;删除最小值 4&#xff0c;删除任意一个元素…

基于樽海鞘群算法的线性规划求解matlab程序

基于樽海鞘群算法的线性规划求解matlab程序 1 樽海鞘群优化算法 1.1 生物启示 通过研究海底生物樽海鞘在觅食过程中群体呈链状向食物方向移动的行为活动&#xff0c;学者Mirjalili在2017年提出的一种新型启发式仿生算法—樽海鞘群智能优化算法&#xff08;Salp Swarm Algori…

javascript三种事件模型 + Dom事件流 +事件委托

目录三种事件模型● DOM0 级模型&#xff1a;● IE 事件模型&#xff1a;● DOM2 级事件模型&#xff1a;DOM事件流事件委托target/currentTarget/relateTarget的区别三种事件模型 ● DOM0 级模型&#xff1a; 这种模型不会传播&#xff0c;所以没有事件流的概念&#xff0c;…

Golang远程调试Debug环境

目录背景软件版本环境搭建安装Golang环境安装dlv环境启动远程环境Goland 连接远程环境参考背景 最近在做 Operator 的二次开发&#xff0c;开发语言是Golang。Operator 开发时候需要用到k8s集群&#xff0c;遗憾的是k8s编排的容器网络与本地网络不通&#xff0c;无法直接进行d…