当前位置: 首页 > news >正文

【算法——动态规划(从dfs回溯开始推导dp)】

基础理论

递归:

递:大问题分解子问题的过程  ; 归:产生答案 

dp:只进行归;用已知的最底层的(递归的边界,搜索树的底),推出未知

《视频索引》

一句话:

dp数组(不一定是数组,也可以是有限数间的来回递推)

递推关系:dfs向下递归的公式

dp数组初始化:递归的边界

动态规划题目的基础就是:回溯——记忆化——dp(一层比一层效率高)

例:

例题

打家劫舍

#include<iostream>
using namespace std;
#include<vector>vector<int>nums = { 10,11,7,12 };vector<int>memo(100, -1);int dfs(int index)    //暴力
{if (index >= nums.size()) return 0;return max( dfs(index + 2) + nums[index], dfs(index + 1) );  //这两个dfs分别代表选和不选,两种情况下的max
}int mem(int index)   //记忆化
{if (memo[index] != -1) return memo[index];   //这个数下面的最大值我们已经记录了,直接返回即可if (index >= nums.size()) return 0;return memo[index]= max(mem(index + 2) + nums[index], mem(index + 1));  //记录当前下面子树最大值
}int main()
{cout << "暴力:"<< dfs(0) << endl << "记忆化:" << mem(0) << endl;vector<int>dp(nums.size(), 0);  //dp.1          dp[i]就是当前房屋的maxdp[0] = nums[0]; dp[1] = max(nums[0],nums[1]);for (int i = 2; i < nums.size(); i++)dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);  //画图,一定要画图,用: 10 11 7 12等试试看,会很通透int a = nums[0], b = max(nums[0], nums[1]), c = 0;    //dp.2for (int i = 2; i < nums.size(); i++)    {c = max(a + nums[i], b);a = b;b = c;}cout << "dp1:" << dp[nums.size() - 1] << endl;cout << "dp2:" << b << endl;return 0;
}

爬楼梯(斐波那契)

递推草稿&视频:动态规划(dp)入门 | 这tm才是入门动态规划的正确方式! | dfs记忆化搜索 | 全体起立!!_哔哩哔哩_bilibili

#include<iostream>
using namespace std;
#include<vector>
#include<chrono>vector<int>memo(100, -1);
int mem(int index)      //记忆化(剪枝)
{if (memo[index] != -1) return memo[index]; if (index == 1) return 1;if (index == 2) return 2;memo[index] = mem(index - 1) + mem(index - 2);return memo[index];
}int dfs(int index)  //暴力
{if (index == 1) return 1;if (index == 2) return 2;return dfs(index - 1) + dfs(index - 2);
}int time(int(*k)(int),int n)  //用时测试函数
{auto start = std::chrono::steady_clock::now();k(n);auto end = std::chrono::steady_clock::now();return std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
}int main()
{int n; cin >> n;cout << dfs(n) << endl << mem(n) << endl;memo.clear();  memo.resize(100,-1);cout <<"暴力用时:"<< time(dfs, n) << "   " <<"记忆化用时:" << time(mem, n) << endl;vector<int>dp(n, 0);  //dp   当然也可以用三个变量来互相推dp[0] = 1, dp[1] = 2;for (int i = 2; i < n; i++)dp[i] = dp[i - 1] + dp[i - 2];cout << dp[n - 1] << endl;return 0;
}

数字三角形

#include<iostream>
using namespace std;
#include<vector>//最大子路径:max    最小minvector<vector<int>>nums(100, vector<int>(100, 0));
int n;
vector<vector<int>>memo(100, vector<int>(100, -1));  int dfs(int x, int y)  //暴力
{if (x >=n || y >= n ) return 0;return max(dfs(x + 1, y) + nums[x][y], dfs(x + 1, y + 1) + nums[x][y]);
}int mem(int x,int y)   //记忆化(剪枝)
{if (memo[x][y]!=-1) return memo[x][y];if (x >= n || y >= n) return 0;return memo[x][y] = max(mem(x + 1, y) + nums[x][y], mem(x + 1, y + 1) + nums[x][y]);
}int main()
{cin >> n;for (int i = 0; i < n; i++)for (int j = 0; j <= i; j++)cin >> nums[i][j];cout << "暴力:" << dfs(0, 0) << endl;cout << "记忆化:" << mem(0, 0) << endl;vector<vector<int>>dp(n + 1, vector<int>(n + 1, 0));  //注意这个+1;自己思考一下for (int i = n - 1; i >= 0; i--)   //dp  从下往上for (int j = 0; j < n; j++)dp[i][j]=max(dp[i+1][j+1]+nums[i][j],dp[i+1][j]+nums[i][j]);cout << "dp(从下往上递推也就是遵循从上往下递归):" << dp[0][0] << endl;return 0;
}

数字三角形递推2(上往下也就是遵循下往上递归)

#include<iostream>
using namespace std;
#include<vector>int main()
{//1  从1开始int n; cin >> n;vector<vector<int>>nums(n + 1, vector<int>(n + 1, 0));//注意:建议以后动态规划题,原始数据的存储从1开始而不是0(方便),后面有从0开始for (int i = 1; i <= n; i++)for (int j = 1; j <= i; j++)cin >> nums[i][j];cout << endl;vector<vector<int>>dp(n + 1, vector<int>(n + 1, 0));for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)dp[i][j] = max(dp[i - 1][j] + nums[i][j], dp[i - 1][j - 1] + nums[i][j]);for (auto i : dp)   //强烈建议打印dp数组,观察数据是否正常{for (auto j : i)cout << j << " ";cout << endl;}//cout << dp[n][n] << endl;  //err   如果直接到这里就结束就错了//这一步是干嘛?:我们从下到上dp最后答案就是dp[0][0],但是现在上到下,所以最后一整行都是和"下到上的dp[0][0]"同性质的,所以我们需要求maxint res = 0;for (int i = 1; i <= n; i++)res = max(res, dp[n][i]);cout << res << endl;//2  从0开始存储vector<vector<int>>nums2(100, vector<int>(100, 0));cin >> n;for (int i = 0; i < n; i++)for (int j = 0; j <= i; j++)cin >> nums2[i][j];cout << endl;vector<vector<int>>dp2(n + 1, vector<int>(n + 1, 0));for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)dp2[i][j] = max(dp2[i - 1][j] + nums2[i - 1][j - 1], dp2[i - 1][j - 1] + nums2[i - 1][j - 1]);for (auto i : dp2){for (auto j : i)cout << j << " ";cout << endl;}res = 0;for (int i = 1; i <= n; i++)res = max(res, dp2[n][i]);cout << res << endl;return 0;
}

最小路径

64. 最小路径和 - 力扣(LeetCode)

和上一个数字三角形差不多

#include<iostream>
#include<vector>
using namespace std;int main()
{int x, y; cin >> x >> y;vector<vector<int>>nums(x, vector<int>(y, 0));for (int i = 0; i < x; i++)for (int j = 0; j < y; j++)cin >> nums[i][j];vector<vector<int>>dp(x + 1, vector<int>(y + 1, 0));for (int i = x - 1; i >= 0; i--)for (int j = y - 1; j >= 0; j--){if (i + 1 >= x && j + 1 >= y) dp[i][j] = nums[i][j];else if (i + 1 >= x) dp[i][j] = dp[i][j + 1] + nums[i][j];else if (j + 1 >= y) dp[i][j] = nums[i][j] + dp[i + 1][j];else dp[i][j] = max(dp[i + 1][j] + nums[i][j], dp[i][j + 1] + nums[i][j]);}cout << dp[0][0];return 0;
}

相关文章:

【算法——动态规划(从dfs回溯开始推导dp)】

基础理论 递归&#xff1a; 递&#xff1a;大问题分解子问题的过程 &#xff1b; 归&#xff1a;产生答案 dp&#xff1a;只进行归&#xff1b;用已知的最底层的&#xff08;递归的边界&#xff0c;搜索树的底&#xff09;&#xff0c;推出未知 《视频索引》 一句话&…...

不是所有洗碗机都能空气除菌 友嘉灵晶空气除菌洗碗机评测

精致的三餐让你以为生活是“享受”&#xff0c;可饭后那些油腻的锅碗瓢盆却成了你我美好生活的最大障碍。想要只吃美食不洗碗&#xff0c;那一台优秀的洗碗机就必不可少了&#xff01;今天&#xff0c;ZOL中关村在线要评测的就是这样一台不光洗得干净更能有效除菌抑菌的洗碗机—…...

【Linux】如何创建yum 组(yum groups)

如何创建yum 组(yum groups) 在 yum 中创建组信息需要手动编辑并创建一个组文件&#xff0c;然后使用 createrepo 工具生成组信息。以下是一个详细的步骤指南&#xff1a; 1. 创建组信息文件 首先&#xff0c;创建一个 XML 文件来定义组信息。例如&#xff0c;创建一个名为 …...

Linux ssh远程关闭如何保持进程在后台运行的解决方案

问题描述&#xff1a; Unix/Linux下一般想让某个程序在后台运行&#xff0c;很多都是使用 nohup & 在程序结尾让程序自动运行。 使用SSH远程Linux服务器启动应用&#xff0c;都是使用nohup &命令&#xff0c;结果关闭SSH应用仍然挂断了。 我们很多程序并不象mysqld一…...

TypeScript中的泛型

在 TypeScript&#xff08;简称 TS&#xff09;中&#xff0c;泛型&#xff08;Generics&#xff09;是一种允许你为组件&#xff08;如类、接口和函数&#xff09;定义灵活、可重用的类型的方式。泛型可以看作是一种类型参数化&#xff0c;允许你在声明时定义一个或多个类型占…...

LeetCode-2779. 数组的最大美丽值【数组 二分查找 排序 滑动窗口】

LeetCode-2779. 数组的最大美丽值【数组 二分查找 排序 滑动窗口】 题目描述&#xff1a;解题思路一&#xff1a;滑动窗口与排序解题思路二&#xff1a;0解题思路三&#xff1a;0 题目描述&#xff1a; 给你一个下标从 0 开始的整数数组 nums 和一个 非负 整数 k 。 在一步操…...

RIP与OSPF发布默认路由(华为)

#交换设备 RIP与OSPF发布默认路由 合理使用默认路由可以很大程度上减少本地路由表的大小&#xff0c;并可以较好的隐藏一个网络中的路由信息&#xff0c;保护自身网络的隐秘性 另外如果在同一个路由器两端使用了不同的路由协议&#xff0c;那么如果不做路由引入或者发布默认…...

Android 一个改善的okHttp封装库

Android Studio 使用前&#xff0c;对于Android Studio的用户&#xff0c;可以选择添加: compile project(‘:okhttputils’) 或者 compile ‘com.zhy:okhttputils:2.0.0’ Eclipse 自行copy源码。 二、基本用法 目前基本的用法格式为&#xff1a; OkHttpUtils .get()…...

瓦罗兰特低价区怎么下载 瓦罗兰特低价区下载教程+免费加速器推荐

瓦罗兰特是由拳头发行的游戏&#xff0c;以其丰富的游戏内容和刺激的竞技体验赢得了广大玩家的喜爱。于其它热门的射击游戏不一样的是&#xff0c;我们在游戏中可以选择不的英雄&#xff0c;每一个英雄都有着自己独特的技能&#xff0c;我们还可以在游戏中强行改变地形帮助我们…...

lspci总结

lspci总结 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将探讨一个在 Linux 系统中常用的命令&#xff1a;lspci。lspci 命令用于列出当前系统中的 P…...

Android开启HTTP服务

需求&#xff1a;通过手机给设备升级固件&#xff0c;设备有WIFI 方案&#xff1a;升级包放到APP可以访问的目录&#xff0c;手机开热点并启动一个HTTP服务&#xff0c;设备连接手机热点&#xff0c;另外&#xff0c;设备端开启一个 telnet 服务&#xff0c;手机通过 telnet 登…...

NLP - word2vec详解

Word2Vec是一种用于将词汇映射到高维向量空间的自然语言处理技术。由Google在2013年提出&#xff0c;它利用浅层神经网络模型来学习词汇的分布式表示。Word2Vec有两种主要模型&#xff1a;CBOW&#xff08;Continuous Bag of Words&#xff09;和Skip-gram。 1. 模型介绍 Con…...

AI办公自动化:用通义千问批量翻译长篇英语TXT文档

在deepseek中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;现在要完成一个编写基于qwen-turbo模型API和dashscope库的程序脚本&#xff0c;具体步骤如下&#xff1a; 打开文件夹&#xff1a;F:\AI自媒体内容\待翻译&#xff1b; 获取里面所有TXT文档&#xff…...

一键解压,无限可能——BetterZip,您的Mac必备神器!

BetterZip for Mac 是一款高效、智能且安全的解压缩软件&#xff0c;专为Mac用户设计。它提供了直观易用的界面&#xff0c;使用户能够轻松应对各种压缩和解压缩需求。 这款软件不仅支持多种压缩格式&#xff0c;如ZIP、RAR、7Z等&#xff0c;还具备快速解压和压缩文件的能力。…...

【数学】什么是最大似然估计?如何求解最大似然估计

背景 最大似然估计&#xff08;Maximum Likelihood Estimation, MLE&#xff09;是一种估计统计模型参数的方法。它在众多统计学领域中被广泛使用&#xff0c;比如回归分析、时间序列分析、机器学习和经济学。其核心思想是&#xff1a;给定一个观测数据集&#xff0c;找到一组…...

跟张良均老师学大数据人工智能|企业项目试岗实训开营

我国高校毕业生数量连年快速增长&#xff0c;从2021年的909万人到2022年的1076万人&#xff0c;再到2023年的1158万人&#xff0c;预计到2024年将达到1187万人&#xff0c;2024年高校毕业生数量再创新高。 当年高校毕业生人数不等于进入劳动力市场的高校毕业生人数&#x…...

Pentest Muse:一款专为网络安全人员设计的AI助手

关于Pentest Muse Pentest Muse是一款专为网络安全研究人员和渗透测试人员设计和开发的人工智能AI助手&#xff0c;该工具可以帮助渗透测试人员进行头脑风暴、编写Payload、分析代码或执行网络侦查任务。除此之外&#xff0c;Pentest Muse甚至还能够执行命令行代码并以迭代方式…...

10 SpringBoot 静态资源访问

我们在开发Web项目的时候&#xff0c;往往会有很多静态资源&#xff0c;如html、图片、css等。那如何向前端返回静态资源呢&#xff1f; 以前做过web开发的同学应该知道&#xff0c;我们以前创建的web工程下面会有一个webapp的目录&#xff0c;我们只要把静态资源放在该目录下…...

Unity 之通过自定义协议从浏览器启动本地应用程序

内容将会持续更新&#xff0c;有错误的地方欢迎指正&#xff0c;谢谢! Unity 之通过自定义协议从浏览器启动本地应用程序 TechX 坚持将创新的科技带给世界&#xff01; 拥有更好的学习体验 —— 不断努力&#xff0c;不断进步&#xff0c;不断探索 TechX —— 心探索、心进…...

Python抓取天气信息

Python的详细学习还是需要些时间的。如果有其他语言经验的&#xff0c;可以暂时跟着我来写一个简单的例子。 2024年最新python教程全套&#xff0c;学完即可进大厂&#xff01;&#xff08;附全套视频 下载&#xff09; (qq.com) 我们计划抓取的数据&#xff1a;杭州的天气信息…...

【超越拟合:深度学习中的过拟合与欠拟合应对策略】

如何处理过拟合 由于过拟合的主要问题是你的模型与训练数据拟合得太好&#xff0c;因此你需要使用技术来“控制它”。防止过拟合的常用技术称为正则化。我喜欢将其视为“使我们的模型更加规则”&#xff0c;例如能够拟合更多类型的数据。 让我们讨论一些防止过拟合的方法。 获…...

【Orange Pi 5与Linux内核编程】-理解Linux内核中的container_of宏

理解Linux内核中的container_of宏 文章目录 理解Linux内核中的container_of宏1、了解C语言中的struct内存表示2、Linux内核的container_of宏实现理解3、Linux内核的container_of使用 Linux 内核包含一个名为 container_of 的非常有用的宏。本文介绍了解 Linux 内核中的 contain…...

003.Linux SSH协议工具

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…...

web前端组织分析:深入剖析其结构、功能与未来趋势

web前端组织分析&#xff1a;深入剖析其结构、功能与未来趋势 在数字化浪潮的推动下&#xff0c;Web前端组织作为连接用户与数字世界的桥梁&#xff0c;其重要性日益凸显。本文将从四个方面、五个方面、六个方面和七个方面对Web前端组织进行深入分析&#xff0c;揭示其结构特点…...

GitCode热门开源项目推荐:Spider网络爬虫框架

在数字化高速发展时代&#xff0c;数据已成为企业决策和个人研究的重要资源。网络爬虫作为一种强大的数据采集工具受到了广泛的关注和应用。在GitCode这一优秀的开源平台上&#xff0c;Spider网络爬虫框架凭借其简洁、高效和易用性&#xff0c;成为了众多开发者的首选。 一、系…...

实现一个二叉树的前序遍历、中序遍历和后序遍历方法。

package test3;public class Test_A27 {// 前序遍历&#xff08;根-左-右&#xff09;public void preOrderTraversal(TreeNode root){if(rootnull){return;}System.out.println(root.val"");preOrderTraversal(root.left);preOrderTraversal(root.right);}// 中序遍…...

串扰(二)

三、感性串扰 首先看下串扰模型及电流方向&#xff1a; 由于电感是阻碍电流变化&#xff0c;受害线的电流方向和攻击线的电流方向相反。同时由于受害线阻抗均匀&#xff0c;故有Vb-Vf&#xff08;感应电流属于电池内部电流&#xff09;。 分析感性串扰大小仍然是按微分的方法…...

零基础入门学用Arduino 第四部分(三)

重要的内容写在前面&#xff1a; 该系列是以up主太极创客的零基础入门学用Arduino教程为基础制作的学习笔记。个人把这个教程学完之后&#xff0c;整体感觉是很好的&#xff0c;如果有条件的可以先学习一些相关课程&#xff0c;学起来会更加轻松&#xff0c;相关课程有数字电路…...

Mp3文件结构全解析(一)

Mp3文件结构全解析(一) MP3 文件是由帧(frame)构成的&#xff0c;帧是MP3 文件最小的组成单位。MP3的全称应为MPEG1 Layer-3 音频 文件&#xff0c;MPEG(Moving Picture Experts Group) 在汉语中译为活动图像专家组&#xff0c;特指活动影音压缩标准&#xff0c;MPEG 音频文件…...

ES 8.14 Java 代码调用,增加knnSearch 和 混合检索 mixSearch

1、pom依赖 <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-client</artifactId><version>8.14.0</version></dependency><dependency><groupId>co.elastic.clients<…...

政府网站建设方案书/seo是指什么职位

一、对象存活判断判断对象是否存活一般有两种方式&#xff1a;1.引用计数&#xff1a;每个对象有一个引用计数属性&#xff0c;新增一个引用时计数加1&#xff0c;引用释放时计数减1&#xff0c;计数为0时可以回收。此方法简单&#xff0c;无法解决对象相互循环引用的问题。2.可…...

网站开发工程师怎么样/免费网站推广软件哪个好

*bootstrap官方说明&#xff1a;http://v3.bootcss.com/javascript/#popovers一. popover常用配置参数&#xff1a;1 //常用配置参数&#xff1a;2 $(document).ready(function() {3 $(#temp).popover(4 {5 trigger:click, //触发方式6 template: , //你自定义的模板7 title:&q…...

怎么做网站站长/seo搜索引擎优化就业前景

现在主流的网站开发语言无外乎asp、php、asp.net、jsp等。 网页从开始简单的hmtl到复杂的服务语言&#xff0c;走过了10多个年头&#xff0c;各种技术层出不穷&#xff0c;单个的主流技术也在不断翻新的版本&#xff0c;现在分析下各种语言的区别、优势、劣势、开发注意事项&am…...

中国苹果手机官方网站序列号查询/推广网站推广

近期移动端项目用到了很多时间轴。纵向的。开始可以实现&#xff0c;但是不利于维护。整理下&#xff0c; 以作为备份留存学习参考。子元素的 标签的 &#xff1a;before实现圆点&#xff0c;:after实现边线border纵向时间轴,单一右边内容:padding-left即可实现;如果时间轴边线…...

包头网站建设公司/软文广告500字

在这里先向大家道个歉&#xff0c;之前在char类型-128到127文章中没有讲清楚原反补的具体求解过程&#xff0c;并且犯了严重的错误&#xff0c;补码-128是不存在原码和反码. 简单介绍一下原码的取值范围都是-128到127&#xff0c;并且0都存在两种状态0和-0。补码中0只有一种状…...

数字营销策划公司/南宁seo推广

一、问题 GROUP BY分组后取最新时间的一条记录的SQL的解决方案。 二、解决方案 SELECTb.no,b.ver,b.gen,b.ip FROM(SELECTa.id,a.no,a.ver,a.gen,a.crtime,a.ip,a.mtFROMzs_fet_heartbeat AS aWHEREa.crtimeHAVING1ORDER BYa.crtime DESC) b GROUP BYb.no; 特别感觉https:/…...