动态规划

动态规划

  • 动态规划(DP)是一种对问题的状态空间进行分阶段、有顺序、不重复、决策性遍历的算法。
  • 关键与前提
    • 重叠子问题:与递归、分治等一样,要具有同类子问题,用若干维状态表示。
    • 最优子结构:状态对应着一个最优化目标,并且最优化目标之间具有推导关系。
    • 无后效性:问题的状态空间是一张有向无环图(可按一定的顺序遍历求解)
    • 动态规划一般采用递推的方式实现,可以写成递归或搜索的形式,因为每个状态只遍历一遍,也被称为记忆化搜索
  • 动态规划三要素:阶段(线性增长)状态(具有最优子结构)决策(找到子问题)
  • 动态规划打印方案:记录转移路径 + 递归输出
    • 动态规划选取 “代表”,维护了一个最优子结构。
    • 如果记录每个最优子结构的详细方案,时间复杂度会上升。
  • 动态规划模版
    // 0. Move index to 1-based
    // 1. Define f, initialize 
    // 2. Loop over all states
    // 3. Copy decisions
    // 4. return target
    int maxProfit(vector<int>& prices) {int n = prices.size();// 0. move index to 1-basedprices.insert(prices.begin(), 0);// 1. define f, initvector<vector<int>> f(n + 1, vector<int>(2, -1e9));f[0][0] = 0;// 2. loop all statesfor (int i = 1; i <= n; i++) {// 3. copy decisionsf[i][1] = max(f[i][1], f[i - 1][0] - prices[i]);f[i][0] = max(f[i][0], f[i - 1][1] + prices[i]);for (int j = 0; j < 2; j++) {f[i][j] = max(f[i][j], f[i - 1][j]);}}// 4. return targetreturn f[n][0];
    }
    

LeetCode 练习题

  • 322. 零钱兑换
  • 62. 不同路径
  • 63. 不同路径 II
  • 1143. 最长公共子序列
  • 300. 最长递增子序列
  • 53. 最大子数组和
  • 152. 乘积最大子数组
  • 70. 爬楼梯
  • 120. 三角形最小路径和
  • 673. 最长递增子序列的个数
  • 121. 买卖股票的最佳时机
  • 122. 买卖股票的最佳时机 II
  • 123. 买卖股票的最佳时机 III
  • 188. 买卖股票的最佳时机 IV
  • 714. 买卖股票的最佳时机含手续费
  • 309. 买卖股票的最佳时机含冷冻期
  • 198. 打家劫舍
  • 213. 打家劫舍 II
  • 72. 编辑距离

背包问题

0/1 背包

  • 给定 N 物品,其中第 i i i 个物品的体积为 V i V_i Vi,价值为 W i W_i Wi

  • 有一容积为 M M M 的背包,要求选择一些物品放入背包,使得物品总体积不超过 M M M 的前提下,物品的价值总和最大。

  • F [ i , j ] 表示从前  i 个物品中选出了总体积为  j 的物品放入背包,物品的最大价值和 F[i, j] 表示从前 \ i \ 个物品中选出了总体积为 \ j \ 的物品放入背包,物品的最大价值和 F[i,j]表示从前 i 个物品中选出了总体积为 j 的物品放入背包,物品的最大价值和

    • F [ i , j ] = m a x { F [ i − 1 , j ] 不选第  i 个物品 F [ i − 1 , j − V i ] + W i i f j ≥ V i 选第  i 个物品 F[i, j] = max\left\{ \begin{aligned} F[i-1,j] \quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad \ \ \ \ \ \ 不选第 \ i \ 个物品 \\ F[i-1,j-V_i] +W_i \quad\quad if\quad j\geq V_i \quad\quad选第 \ i \ 个物品 \end{aligned} \right. F[i,j]=max{F[i1,j]      不选第 i 个物品F[i1,jVi]+WiifjVi选第 i 个物品
    • 初值: F [ 0 , 0 ] = 0 F[0,0] = 0 F[0,0]=0,其余为负无穷
    • 目标: max ⁡ 0 ≤ j ≤ M { F [ N ] [ j ] } \max_{0 \leq j \leq M} \left\{ F[N][j] \right\} max0jM{F[N][j]}
    vector<vector<int>> f(n + 1, vector<int>(m + 1, -1e9));
    f[0][0] = 0;for (int i = 1;i <= n;i++) {for (int j = 0;j <= m;j++) {f[i][j] = f[i - 1][j];}for(int j = v[i];j <= m;j++) {f[i][j] = max(f[i][j], f[i - 1][j - v[i]] + w[i]);}
    }int ans = 0;
    for (int j = 0;j <= m;j++) ans = max(ans, f[n][j]);
    
    vector<int> f(m + 1, -1e9);
    f[0] = 0;for (int i = 1;i <= n;i++)for (int j = m;j >= v[i];j--) // 必须倒序f[j] = max(f[j], f[j - v[i]] + w[i]);int ans = 0;
    for (int j = 0;j <= m;j++) ans = max(ans, f[j]);
    

LeetCode 练习题

  • 416. 分割等和子集
  • 494. 目标和

完全背包

  • 给定 N 物品,其中第 i i i 种物品的体积为 V i V_i Vi,价值为 W i W_i Wi,并且有无数个

  • 有一容积为 M M M 的背包,要求选择一些物品放入背包,使得物品总体积不超过 M M M 的前提下,物品的价值总和最大。

  • F [ i , j ] 表示从前  i 种物品中选出了总体积为  j 的物品放入背包,物品的最大价值和 F[i, j] 表示从前 \ i \ 种物品中选出了总体积为 \ j \ 的物品放入背包,物品的最大价值和 F[i,j]表示从前 i 种物品中选出了总体积为 j 的物品放入背包,物品的最大价值和

    • F [ i , j ] = m a x { F [ i − 1 , j ] 尚未选过第  i 种物品 F [ i , j − V i ] + W i i f j ≥ V i 从第  i 种物品中选一个 F[i, j] = max\left\{ \begin{aligned} F[i-1,j] \quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad \ \ \ 尚未选过第 \ i \ 种物品 \\ F[i,j-V_i] +W_i \quad\quad if\quad j\geq V_i \quad\quad\quad\quad从第 \ i \ 种物品中选一个 \end{aligned} \right. F[i,j]=max{F[i1,j]   尚未选过第 i 种物品F[i,jVi]+WiifjVi从第 i 种物品中选一个
    • 初值: F [ 0 , 0 ] = 0 F[0,0] = 0 F[0,0]=0,其余为负无穷
    • 目标: max ⁡ 0 ≤ j ≤ M { F [ N ] [ j ] } \max_{0 \leq j \leq M} \left\{ F[N][j] \right\} max0jM{F[N][j]}
    vector<int> f(m + 1, -1e9);
    f[0] = 0;for (int i = 1;i <= n;i++)for (int j = v[i];j <= m;j++) // 正序f[j] = max(f[j], f[j - v[i]] + w[i]);int ans = 0;
    for (int j = 0;j <= m;j++) ans = max(ans, f[j]);
    

LeetCode 练习题

  • 322. 零钱兑换
  • 518. 零钱兑换 II
  • 279. 完全平方数
  • 55. 跳跃游戏

区间动态规划

  • 区间动态规划的子问题是基于一个区间的。
  • 区间长度作为 D P DP DP 的 “阶段”,区间端点作为 D P DP DP 的 “状态”。
  • 在计算区间长度为 l e n len len 的子问题时,要先算好所有长度 < l e n < len <len 的子问题。

LeetCode 练习题

  • 312. 戳气球
  • 516. 最长回文子序列

树形动态规划

  • 是套在深度优先遍历里的动态规划(在 D F S DFS DFS 的过程中实现 D P DP DP
  • 子问题就是 “一棵子树”,状态一般表示为 “以 x x x 为根的子树”,决策就是 “ x x x 的子节点”。

LeetCode 练习题

  • 337. 打家劫舍 III
  • 124. 二叉树中的最大路径和

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

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

相关文章

四、软考-系统架构设计师笔记-信息系统基础知识

1、信息系统概述 信息系统的定义 信息系统是由计算机硬件、网络和通信设备、计算机软件、信息资源、信息用户和规章制度组成的以处理信息流为目的的人机一体化系统。 信息系统任务是对原始数据进行收集、加工、存储&#xff0c;并处理产生各种所需信息&#xff0c;以不同的方式…

修改Android打包apk的名字和目录

app打包生成apk后通常需要进行备份&#xff0c;但是要区分好哪个apk是什么版本的、什么时候打包的&#xff0c;以方便以后区分使用。 最开始的想法是把版本号、创建时间这些加在apk文件名上即可&#xff0c;但是公司要求apk使用一个固定的名称&#xff0c;那我怎么保存版本号信…

Ubuntu平铺左、右、上、下、1/2、1/4窗口(脚本)

前言 之前因为一直在用Ubuntu 18或者Ubuntu 20然后发现装了GNOME插件后&#xff0c;电脑在使用过程中&#xff0c;会时不时的卡死&#xff08;鼠标没问题&#xff0c;键盘输入会有10-20秒的延迟&#xff09;频率基本是一小时一次&#xff0c;因为这种卡顿会很容易打断思路&…

Jenkins 部署 RuoYi

目录 1、项目介绍 2、部署若依 clone 源代码 导入数据库到 node-16 修改 RuoYi 配置文件 推送 RuoYi 项目至 Gitlab 3、配置 Jenkins 配置本地 Maven Jenkins 配置 Maven 新建 Maven 项目 编写构建后的脚本 Jenkins 构建后执行脚本 4、Jenkins 传递参数 设置项目部…

React 19 Cheat Sheet

React 19让构建网站和应用程序变得更容易&#xff0c;更好。有了很酷的新东西&#xff0c;比如React编译器、Actions API和更好的Hooks&#xff0c;编写代码变得更快&#xff0c;管理应用程序的数据变得更简单 React 19让构建网站和应用程序变得更容易&#xff0c;更好。有了很…

maven 进行jdbc 查询

a. 在pom.xml 增加 依赖 mysql-connector-java依赖b. 编写 实体类, 按照 数据库表 生成对应的 类数据库类型 java 类型int intvarchar Stringdatetime java.util.Date注意事项: 属性名 采用 驼峰式命名法实体类 要求采用 封装的写…

MySQL之主从同步(openEuler版)

实验目的&#xff1a; 基于binlog和gtid两种方法实现主从同步 实验过程&#xff1a; 一、使用binlog方法实现MySQL的主从同步 主库配置 配置文件&#xff1a; [rootopeneuler ~]# vim /etc/my.cnf//进入mysql配置文件配置server_id [rootopeneuler ~]# tail -1 /etc/my.cn…

股票价格预测项目

项目介绍 背景 股票价格预测一直是金融领域的热点问题。准确的预测可以帮助投资者作出更明智的决策。本项目旨在使用机器学习技术&#xff0c;特别是长短期记忆网络&#xff08;LSTM&#xff09;&#xff0c;来预测股票价格。 目标 开发一个基于LSTM的股票价格预测模型。使…

使用 Logstash 丰富你的 Elasticsearch 文档

作者&#xff1a;来自 Elastic David Pilato 我们在上一篇文章中看到&#xff0c;我们可以使用摄取管道中的 Elasticsearch Enrich Processor 在 Elasticsearch 中进行数据丰富。 但有时&#xff0c;你需要执行更复杂的任务&#xff0c;或者你的数据源不是 Elasticsearch&#…

python的scripts文件夹作用

Windows系统&#xff1a; Scripts文件夹通常位于Python的安装目录下&#xff0c;如C:\Python\Scripts。该文件夹内包含了各种有用的工具&#xff0c;例如pip、virtualenv等&#xff0c;这些工具有助于管理和配置Python环境和依赖包。 Linux系统&#xff1a; 在Linux系统中&…

集简云新增通义千问qwen 72b chat、qwen1.5 等多种大语言模型,提升多语言支持能力

通义千问再开源&#xff01;继发布多模态模型后&#xff0c;通义千问 1.5 版本也在春节前上线。 此次大模型包括六个型号&#xff1a;0.5B、1.8B、4B、7B、14B 和 72B&#xff0c;性能评测基础能力在在语言理解、代码生成、推理能力等多项基准测试中均展现出优异的性能&#x…

大话设计模式——5.代理模式(Proxy Pattern)

1.定义 为其他具体对象提供一种代理用以控制对这个对象的访问&#xff0c;属于结构型模式。 UML图&#xff1a; 2.示例 生活中有许多的代理&#xff0c;如房产中介&#xff0c;房主出售的房子挂在中介处&#xff0c;中介帮忙寻找需要的客户&#xff0c;客户不需要直接接触房…

linux tar分卷压缩与windows合并解压

linux tar分卷压缩 tar -czf - Shadowsocks | split -b 1000k -d - shadowsocks.tar.gz tar -czf - 文件夹名 | split -b 1000k -d - 输出文件 如有如下几个tar分卷&#xff1a;logs.tar.gza1、logs.tar.gza2、logs.tar.gza3&#xff0c;在Windows下如何进行合并呢&#xff…

【备战蓝桥杯系列】单源最短路径Dijkstra算法模板

Dijkstra算法模板 蓝桥杯中也是会考到图论最短路的&#xff0c;一旦考到&#xff0c;基本是不会太难的&#xff0c;只要知道板子就基本能拿分了。 两个板子如下 朴素Dijkstra算法 适应情况&#xff1a;稠密图&#xff0c;正权边 时间复杂度 O(n^2 m) int dijkst(){memse…

银河麒麟服务器ky10 server wvp镜像制作

在线安装docker yum install docker -y cat >/etc/docker/daemon.json<<EOF{"registry-mirrors": ["https://registry.docker-cn.com","https://dockerhub.azk8s.cn","https://hub-mirror.c.163.com"]} EOF systemctl start …

php集成修改数据库的字段

1.界面效果 2.代码 <?phpecho <form action"" method"post"><label for"table">表名:</label><input type"text" id"table" name"table"><br><div id"fieldsContaine…

js【详解】async await

为什么要使用 async await async await 实现了使用同步的语法实现异步&#xff0c;不再需要借助回调函数&#xff0c;让代码更加易于理解和维护。 (async function () {// await 必须放在 async 函数中try {// 加载第一张图片const img1 await loadImg1()// 加载第二张图片co…

P1002 [NOIP2002 普及组] 过河卒

题目 原题目链接 题目描述 棋盘上 A A A 点有一个过河卒&#xff0c;需要走到目标 B B B 点。卒行走的规则&#xff1a;可以向下、或者向右。同时在棋盘上 C C C 点有一个对方的马&#xff0c;该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河…

比较两组二维平面结构的演化

假设1个6*6的二维平面空间&#xff0c;这个空间的行和列只能按照1-2-3-4-5-6-1的顺序变换。这个平面上的物体只能平移。在这个空间里有力&#xff0c;在这些力的作用下&#xff0c;两个点按照 1-7的顺序运动。 - - - - - - - - - - - - - - - A - - - - - …

序列化相关知识总结

目录 一、序列化1.1 基本概念1.1.1 序列化1.1.2 反序列化1.1.3 数据结构、对象与二进制串1.1.4 序列化/反序列化的目的 1.2 几种常见的序列化和反序列化协议1.2.1 XML&SOAP1.2.2 JSON&#xff08;Javascript Object Notation&#xff09;1.2.3 Protobuf 二、安卓下的序列化…