动态规划的一个初步学习

啥叫动态规划

在我们写很多的题目时,常常可以用暴力枚举来写,缺点就是速度太慢了。如果我们用一个数组或者哈希表(虽然我还没学过哈希表)将之前暴力枚举的数据储存起来,当再一次枚举到这个数字的时候就直接调用数组或者哈希表里面的数据,这样就能节省很多时间。所以动态规划就是带数组记忆的递归,所以动态规划也往往叫做记忆化搜索

1.状态转移方程是啥:状态转移方程根据我的理解就是,可以根据前面的一维数组(或者二维数组)推出接下来的数组中的值,优点类似于数学里面的数列里面的递推公式,在动态规划里面比较核心的的就是想出其递推公式,想出来后题目也会变得通透的多。

做动态规划的五步骤

1.dp数组以及下标的含义。
2.递推公式。
3.dp数组的初始化。
4.遍历顺序。
5.打印dp数组

01背包问题

优化前:用一个二维数组来存放数据。优化后:用一个一维数组来存放数据(所以01背包也是由相对固定的模板的)

优化前:二维数组进行存储
首先根据5步曲来,分析一下dp数组的含义:下标为0到i之间的物品(不同的物品有着不同的价值),任取放进容量为j的背包里面,而dp数组的具体值就是放进去这个物品的最大价值。

递推公式不放物品dp[i-1][j];
                      放物品dp[i-1][j-wight[i]]+value[i];(这个value[i]就是i这个物品的价值,同时还要声明一下,这里其实还要做一下判断,看是否有超过背包的最大容量)

最终的模样:dp[i][j]=max(dp[i-1][j],dp[i-1][j-wight[i]]+value[i]);

dp数组的初始化:需要将第一个物品那一行给初始化,其他的都初始化为0.

优化后:使用滚动数组也就是使用一维数组来实现价值最大化   
形象一点就是将这个二维矩阵压缩,或者是将这个贴在一个圆柱上,每次进行到下一个物品的时候就将这个圆柱转一下就切换到下一个物品了。
含义:dp数组里面存放的依然是物品的价值,而下标就是和未优化前的二维数组中的j一样:容量为j的背包所能装的最大价值为dp[j];

递归公式:dp[j]=max(dp[j],dp[j-wight[i]]+value[i]); 这个就是相当于将前一个物品给拷贝过来一份,所以在这里的dp[j]就是相当于前一层的数据。

 列题

过河卒

 做动态规划最重要的就是推出其递推公式,一般很难想到,所以这里建议先在二维数组先写几个数,然后看看这些数之间有没有什么关系(数学归纳法:先写出来几个看看这些数字有啥关系,然后如果找到规律了就直接使用)
(该图来自b站up:LetsLearning)

写几个数字就能发现,在没有马的情况下二维数组中的每一个数的值都是由它的上面和左边加构成,所以通过这里就可以的得到递推公式;a[i][j]=a[i-1][j]+a[i][j-1]; 

接下来就是加上马的干扰,我们先将整个棋盘全部初始化为1(这样做的目的是为了将0行和0列初始化为1,方便接下来的操作),我们用一个方向数组(这个数组里面记载的是马的行走规则,集“日”字型走),用一个for循环将马走到的地方全部初始化为0,这样进行递推的时候就方便进行加,如果加上马的话就需要堆递推进行一点小改动,主要就是体现在第0行和第0列的改动,这个时候第0行和第0列的的递推公式就要改成    a[i][j]=a[i][j-1];    a[i][j]=a[i-1][j]; ,因为马做过的地方的左边和上面都不能走,如果马的这个地方为0,那么后面相加的时候也会为0,就不会对后面的造成影响。
代码如下(中间这些被注释掉的没有必要看,就是用来检查我有没有做对)(对了a数组要开long long类型的,不然有些数据会过不了)

#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
ll a[35][35];
int n,m;
int x,y;
int dx[9]={0,-1,-2,-2,-1, 1, 2, 2,1};
int dy[9]={0,-2,-1, 1, 2,-2,-1, 1,2};
int main()
{//初始化为1cin>>n>>m>>x>>y;for(int i=0;i<=n;i++){for(int j=0;j<=m;j++){a[i][j]=1;}}//马的存在
for(int i=0;i<=8;i++){int tx=x+dx[i];int ty=y+dy[i];if(tx<0||tx>n||ty>m||ty<0)continue;elsea[tx][ty]=0;
}
//检查二维数组
//	for(int i=0;i<=n;i++){
//		for(int j=0;j<=m;j++)
//		printf("%5d ",a[i][j]);
//		printf("\n");
//	}
//接下来就是递推公式for(int i=0;i<=n;i++){for(int j=0;j<=m;j++){if(i==0&&j==0)continue;if(a[i][j]==0)//这个点是马走过的,那这里的值就不能走,就应该为0,由于之前我们已经将马走过的地方赋值为0,所以是可以跳过的continue;if(i==0)a[i][j]=a[i][j-1];else if(j==0)a[i][j]=a[i-1][j];elsea[i][j]=a[i-1][j]+a[i][j-1];}}
//检查二维数组
//	for(int i=0;i<=n;i++){
//		for(int j=0;j<=m;j++)
//		printf("%5d ",a[i][j]);
//		printf("\n");
//	}cout<<a[n][m]<<endl;return 0;	
}

守望者的逃离

思路:先讲一遍不用动态规划来写的方法,我么用一个s1和s2分别代表着不用闪现走的路程,和用闪现走的路程,两边同时开弓。每次进行完一次计算都需要将s1和s2进行一次比较将大者的值赋给s1(由于s1是最特殊的,最后我们输出的变量的值也是s1的值)(其实使用动态规划也是使用这样一个思路)其中这里面很巧妙的思路就是使用一个for循环来代表时间的推进还有使用s1,s2两边同时开工,然后这个路程的取值往往都是取最大(我还没学过贪心)。

代码如下:

#include<iostream>
using namespace std;
int m,s,t;
int main()
{cin>>m>>s>>t;int s1=0,s2=0;for(int i=1;i<=t;i++){s1+=17;if(m>=10){s2+=60;m-=10;}else{m+=4;}if(s2>s1)s1=s2;if(s1>=s){cout<<"Yes"<<endl;cout<<i<<endl;return 0;}}cout<<"No"<<endl;cout<<s1<<endl;return 0;
}

接下就是讲解使用dp数组求解:
思路:和上面的思路其实一样,在这里我感觉到动态规划就是要使用前一个数组元素的值来进行求解(及最关键的就是看大问题是否能够被小问题推出,如果已经看出来这一点那么递推公式也就能写出来了),先将dp数组全部用闪现的方式记录每一秒的运动路程。在进行完全部过程后再使用一个for循环来检查就用看是dp[i]大还是dp[i-1]+17大,如果是后者大那么就将这个值赋给dp[i](我怎么感觉有一点01背包的思想在里面).

#include<iostream>
using namespace std;
int dp[500000000];
int main()
{int m,s,t;cin>>m>>s>>t;for(int i=1;i<=t;i++){if(m>=10){dp[i]=dp[i-1]+60;m-=10;}else{dp[i]=dp[i-1];m+=4;}}for(int i=1;i<=t;i++){if(dp[i]<dp[i-1]+17)dp[i]=dp[i-1]+17;if(dp[i]>=s){printf("Yes\n%d",i);return 0;}}printf("No\n%d",dp[t]);return 0;
}


 

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

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

相关文章

【深蓝学院】移动机器人运动规划--第4章 动力学约束下的运动规划--笔记

0. Outline 1. Introduction 什么是kinodynamic&#xff1f; 运动学&#xff08;Kinematics&#xff09;和动力学&#xff08;Dynamics&#xff09;都是力学的分支&#xff0c;涉及物体的运动&#xff0c;但它们研究的焦点不同。 运动学专注于描述物体的运动&#xff0c;而…

【蓝桥杯冲冲冲】k 短路 / [SDOI2010] 魔法猪学院

蓝桥杯备赛 | 洛谷做题打卡day33 文章目录 蓝桥杯备赛 | 洛谷做题打卡day33题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示数据规模数据更新日志 题解代码我的一些话 【模板】k 短路 / [SDOI2010] 魔法猪学院 题目背景 注&#xff1a;对于 k k k 短路问…

mysql学习笔记-MYSQL介绍

什么是Mysql MySQL目前属于Oracle公司&#xff0c;常见的关系型数据库还有:sql server &#xff0c;MarlaDB,DB2等MYSQL区别于其它关系型数据库的很大一个特点是支持插件式的存储引擎支持如&#xff1a;innoDB&#xff0c;MyLSAM&#xff0c;Memory等MySQL是一种DBMS&#xff…

微信小程序(四十)API的封装与调用

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.在单独的js文件中写js接口 2.以注册为全局wx的方式调用接口 源码&#xff1a; utils/testAPI.js const testAPI{/*** * param {*} title */simpleToast(title提示){//可传参&#xff0c;默认为‘提示’wx.sho…

2024春晚刘谦魔术与约瑟夫环问题

各位小伙伴们大家——过~年~好~~&#xff01;[]~(&#xffe3;▽&#xffe3;)~* 昨晚播出了2024春节联欢晚会&#xff0c;本着在乡下无聊也是无聊不如看看今年春晚有没有什么乐子的心态从晚上20点到次日0点40共4个多小时的时间在人生中首次看完了一整场春晚直播 (((φ(◎ロ◎…

Mysql索引优化建议

1&#xff0c;最左前缀法则 如果为一张表创建了多列的组合索引&#xff0c;要遵守最左前缀法则。就是指查询从索引的最左前列开始并且不要跳过索引中的列。&#xff08;因为Mysql的InnoDB引擎的索引树是一个按顺利排序存储的数据结构&#xff08;BTREE&#xff09;&#xff0c…

[论文精读]Community-Aware Transformer for Autism Prediction in fMRI Connectome

论文网址&#xff1a;[2307.10181] Community-Aware Transformer for Autism Prediction in fMRI Connectome (arxiv.org) 论文代码&#xff1a;GitHub - ubc-tea/Com-BrainTF: The official Pytorch implementation of paper "Community-Aware Transformer for Autism P…

ClickHouse--02--安装

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 安装官网 &#xff1b;[https://clickhouse.com/docs/zh/getting-started/install](https://clickhouse.com/docs/zh/getting-started/install)![在这里插入图片描述…

【算法与数据结构】42、LeetCode接雨水

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;   程序如下&#xff1a; 复杂度分析&#xff1a; 时间复杂度&#xff1a; O ( ) O() O()。空间复…

JDK新特性

JDK新特性 函数式接口和Lambda 表达式Stream流操作新日期API操作其他新特性 Lambda 是一个匿名函数&#xff0c;我们可以把 Lambda表达式理解为是一段可以传递的代码&#xff08;将代码 像数据一样进行传递&#xff09;。可以写出更简洁、更 灵活的代码。作为一种更紧凑的代码…

网络原理(一)

&#x1f495;"Echo"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;网络原理(一) 一. 应用层 应用层是和程序员联系最密切的一层,对于应用层来说,程序员可以自定义应用层协议,应用层的协议一般要约定好以下两部分内容: 根据需求,明确要传输哪些信…

[职场] 测试工程师面试会问些什么 #其他#微信#学习方法

测试工程师面试会问些什么 在测试工程师面试过程中&#xff0c;可能会涉及到具体测试工具、技术和方法的问题。所以在准备面试前&#xff0c;需要熟悉常用的测试理论和实践&#xff0c;掌握基本的测试技能和工具使用。 一.常见问题及答案 1. 你是如何理解软件测试的作用和重要…

nginx添加lua模块

目录 已安装了nginx&#xff0c;后追加lua模块nginx 重新编译知识参考&#xff1a; 从零安装一、首先需要安装必要的库&#xff08;pcre、zlib、openssl&#xff09;二、安装LUA环境及相关库 &#xff08;LuaJIT、ngx_devel_kit、lua-nginx-module&#xff09;注意&#xff1a;…

C# 夺冠,微软.NET前途光明!

本文以C# 摘得 “2023 年度编程语言“称号为背景&#xff0c;介绍.NET的历史、生态及发展势头&#xff0c;该文章是本人C#专栏的第一篇文章。 这里写目录标题 1.C#摘得"2023年度编程语言"奖项2.什么是.NET&#xff1f;2.1.NET简史2.2.NET是用于应用程序开发的生态系…

【Java EE初阶十二】网络初识

1. 网络发展史 网络发展的几个主要时期&#xff1a; 单机时代->局域网时代->广域网时代->移动互联网时代 随着时代的发展&#xff0c;越来越需要计算机之间互相通信&#xff0c;共享软件和数据&#xff0c;即以多个计算机协同工作来完成 业务&#xff0c;就有了网络互…

【Linux系统学习】6.Linux系统软件安装

实战章节&#xff1a;在Linux上部署各类软件 前言 为什么学习各类软件在Linux上的部署 在前面&#xff0c;我们学习了许多的Linux命令和高级技巧&#xff0c;这些知识点比较零散&#xff0c;进行练习虽然可以基础掌握这些命令和技巧的使用&#xff0c;但是并没有一些具体的实…

LLM之RAG实战(二十五)| 使用LlamaIndex和BM25重排序实践

本文&#xff0c;我们将研究高级RAG方法的中的重排序优化方法以及其与普通RAG相比的关键差异。 一、什么是RAG&#xff1f; 检索增强生成&#xff08;RAG&#xff09;是一种复杂的自然语言处理方法&#xff0c;它包括两个不同的步骤&#xff1a;信息检索和生成语言建模。这种方…

YOLOv8算法改进【NO.101】引入最新的损失函数Focaler-IoU

前 言 YOLO算法改进系列出到这&#xff0c;很多朋友问改进如何选择是最佳的&#xff0c;下面我就根据个人多年的写作发文章以及指导发文章的经验来看&#xff0c;按照优先顺序进行排序讲解YOLO算法改进方法的顺序选择。具体有需求的同学可以私信我沟通&#xff1a; 第一…

C#向数组指定索引位置插入新的元素值:自定义插入方法 vs List<T>.Add(T) 方法

目录 一、使用的方法 1.自定义插入方法 2.使用List.Add(T) 方法 二、实例 1.示例1&#xff1a;List.Add(T) 方法 2.示例&#xff1a;自定义插入方法 一、使用的方法 1.自定义插入方法 首先需要定义一个一维数组&#xff0c;然后修改数组的长度(这里使用Length属性获取…

统计数字出现次数的数位动态规划解法-数位统计DP

在处理数字问题时,我们经常遇到需要统计一定范围内各个数字出现次数的情况。这类问题虽然看起来简单,但当数字范围较大时,直接遍历统计的方法就变得不再高效。本文将介绍一种利用数位动态规划(DP)的方法来解决这一问题,具体来说,是统计两个整数a和b之间(包含a和b)所有…