Leetcode 动态规划详解

news2024/11/28 22:46:44

动态规划(Dynamic Programming, DP)是一种解决多阶段决策过程最优化问题的数学方法。动态规划的特点是将原问题分解成多个子问题进行求解,每个子问题只求解一次,并将其结果保存下来,避免重复计算。然后通过组合子问题的解来得到原问题的解。

核心思想

动态规划一般用于求解具有重叠子问题和最优子结构的问题,例如最长公共子序列、背包问题、最短路径等。重叠子问题指的是在求解问题的过程中,多次用到相同的子问题,最优子结构指的是问题的最优解可以通过子问题的最优解来构造。

解题步骤

动态规划的基本步骤是:

  1. 状态定义
  2. 状态转移方程(最优子结构)
  3. 边界条件
  4. 最优解的计算

状态指的是子问题的描述信息,状态转移方程指的是子问题之间的关系,边界条件指的是最简单的子问题的解法,最优解的计算则是通过递推或者回溯等方式得到

Leetcode 真题详解

连续子数组的最大和

解题思路:

  1. 状态定义: dp[i]表示以nums[i]结尾的连续子数组和的最大值
  2. 状态转移方程:
  • 当 dp[i-1] > 0 时,因为此时dp[i-1]对dp[i]是正增长,一定有dp[i] = nums[i] + dp[i-1]
  • 当 dp[i-1] <= 0 时,因为此时dp[i-1]对dp[i]是负增长,一定有dp[i] = nums[i]
public int maxSubArray(int[] nums) {
	int dp = nums[0];
	int max = dp;
	for(int i = 1 ; i < nums.length ; i++){
		dp = dp > 0 ? dp + nums[i] : nums[i];
		max = Math.max(max, dp);
	}
	return max;
}

最后一块石头的重量II

解题思路:

  1. 状态定义: dp[i] 表示是否能够凑出重量为 i 的石头
  2. 状态转移方程: dp[j] |= dp[j - stone]。表示如果之前能够凑出重量为 j - stone 的石头,则现在也能够凑出重量为 j 的石头
  3. 最优解计算:找到最大的能够凑出的重量 j,则最小的可能重量为 sum - 2 * j
public int lastStoneWeightII(int[] stones) {
    int sum = Arrays.stream(stones).sum();
    int target = sum / 2;
    boolean[] dp = new boolean[target + 1];
    dp[0] = true;
    for (int stone : stones) {
        for (int j = target; j >= stone; j--) {
            dp[j] |= dp[j - stone];
        }
    }
    for (int j = target; j >= 0; j--) {
        if (dp[j]) {
            return sum - 2 * j;
        }
    }
    return sum;
}

参考资料:

  1. 动态规划的基本思想与例子解析
  2. 动态规划基础知识

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

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

相关文章

初识Mybatis,并创建第一个Mybatis项目(详细图文教程)

目录 前言 一、Mybatis是什么&#xff1f; 二、Mybatis的优点 三、创建第一个Mybatis项目 配置Mybatis开发环境 创建数据库 添加框架 配置连接字符串和Mybatis 使用Mybatis操作数据库 测试 前言 Spring 集成了 Mybatis 框架&#xff0c;方便我们更加便捷的使用&#…

机器学习算法基础-覃秉丰 笔记版

文章目录 笔记回归sklearn-LASSOsklearn-一元线性回归sklearn-多元线性回归sklearn-岭回归sklearn-弹性网ElasticNetsklearn-逻辑回归sklearn-非线性逻辑回归标准方程法-岭回归梯度下降法-一元线性回归梯度下降法-多元线性回归梯度下降法-逻辑回归梯度下降法-非线性逻辑回归线性…

在kaggle中用GPU训练模型

文章目录 导入文件数据对于文件目录的访问对于文件的下载对GPU的使用 导入文件数据 参考文章&#xff1a; 使用kaggle GPU跑自己的模型 创建你自己的文件数据 对于数据文件创建notebook进行处理 对于文件目录的访问 ①传入的数据文件放在&#xff1a;/kaggle/input/ 文件…

Form Generator 扩展子表单组件之表单校验(超详细)

一、form-generator是什么?✨ ⭐️ 🌟 form-generator的作者是这样介绍的:Element UI表单设计及代码生成器,可将生成的代码直接运行在基于Element的vue项目中;也可导出JSON表单,使用配套的解析器将JSON解析成真实的表单。 但目前它提供的组件并不能满足我们在项目中的…

zabbix通过JMX监控tomcat运行情况

第三阶段基础 时 间&#xff1a;2023年7月20日 参加人&#xff1a;全班人员 内 容&#xff1a; zabbix通过JMX监控tomcat 目录 zabbix通过JMX监控tomcat 一、配置java网关 二、修改zabbix服务端配置文件 三、安装tomcat 四、Zabbix-web端配置 zabbix通过JMX监控tomc…

1.react useState使用与常见问题

文章目录 0. 取消批处理合并更新, render 2次1. 合并更新,setCount(异步更新) 3次相当于1次, count值为12. 如何取消批处理合并,让值累加?,改为回调函数写法,内部会依次执行函数, 执行3次 count值为33. 异步更新,获取异步更新的值?useEffect4.利用扩展运算符的形式来解决对象…

基于sklearn计算precision、recall等分类指标

文章目录 一、分类指标函数1.1 precision_score函数1.2 recall_score函数1.3 accuracy_score函数1.4 f1_score函数1.5 precision_recall_curve函数1.6 roc_curve函数1.7 roc_auc_score函数1.8 classification_report函数 二、二分类任务三、多分类任务3.1 Macro Average&#x…

什么是SQL和NoSQL?

目录 认识NoSQL 关系型数据库 非关系型数据库 关系型数据库与非关系型数据库之间的对比 认识NoSQL SQL&#xff08;Structured Query Language&#xff09;是一种用于管理关系型数据库的语言。关系型数据库以表格的形式存储数据&#xff0c;表格由行和列组成。SQL语言提供了…

Spring MVC -- 获取参数(普通对象+JSON对象+URL地址参数+文件+Cookie/Session/Header)

目录 1.获取参数 1.1获取单个参数 1.2获取多个参数 传参注意事项&#xff1a; 2.获取对象 3.后端参数重命名RequestParam 4.获取JSON对象RequestBody 5.从 URL 地址中获取参数 PathVariable 6.上传文件 RequestPart 7.获取Cookie/Session/Header 7.1 获取 Request 和…

uniapp开发app获取当前位置的经纬度

查阅了大量的帖子&#xff0c;发现基本上都不能用&#xff0c;后来发现需要配置一下manifest.json才可以&#xff0c;话不多说上代码 真机运行打印出来的经纬度&#xff1a; 一、配置文件 检查一下manifest.json有没有下面的代码&#xff0c;没有的话就加上 { "permiss…

力扣算法 704 35 34 69 367二分查找

704.二分查找 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 二分查找法 class Solution { public:int search(vecto…

Centos安装GitLab教程

相关网站 官网安装文档可以按照官方文档去安装&#xff0c;但安装过程中可能会出错。所以最好按照本文章的流程去安装&#xff0c;我是边安装边写的文章。 准备工作 在vmware上安装centos&#xff0c;这里要注意下&#xff0c;gitlab比较占用内存&#xff0c;因此要分配至少…

vue 3.0 下载本地pdf文件

使用a标签,把pdf文件放到public文件夹下面 <el-form label-width"160px"> <el-form-item label"使用手册"> <div class"form-item-static"> <a href"/使用手册.pdf" target"_blank" class"link&q…

轻量级Firefox Send替代方案Gokapi

想不到一个域名的变动会影响这么大&#xff0c;访问量出现断崖式下跌。由此可见&#xff0c;平时的访问应该只是一些 RSS 的访问而已。 上面是 Pageviews&#xff0c;下面是 Uniques 今天略有回升 难怪那些大公司要花钱买域名了&#xff0c;不过老苏是个佛系的人&#xff0c;一…

【pom.xml文件】maven中scope标签和optional标签

文章目录 前言一. scope的类型总览二. 详解1.compile&#xff08;默认选项&#xff09;2. test3. runtime4.privided5. system6. import 三.optional 前言 一. scope的类型总览 设置依赖范围 可以对引入的资源进行设置&#xff0c;设置其生效的范围。生效范围主要有以下&#…

mac如何提取视频中的音频?

mac如何提取视频中的音频&#xff1f;我们经常在平时工作的时候&#xff0c;需要将一个视频里面的音频单独提取出来另做他用&#xff0c;例如很多视频自媒体博主就经常使用这种方法来储备音频素材&#xff0c;这个操作在Windows上面比较容易实现&#xff0c;毕竟有相当多的软件…

RT-Thread qemu mps2-an385 bsp 移植制作 :系统运行篇

前言 前面已经让 RT-Thread 进入了 entry 入口函数&#xff0c;并且 调整 链接脚本&#xff0c;自动初始化与 MSH shell 的符号已经预留&#xff0c; 进入了 RT-Thread 的初始化流程 接下来&#xff1a;从 内存管理、系统tick 定时器、适配串口 uart 驱动三个模块入手&#xf…

Vue-组件高级(下)

一、目标 能够知道如何使用ref引用DOM和组件实例能够知道$nextTick的调用时机能够说出keep-alive元素的作用能够掌握插槽的基本用法能够知道如何自定义指令 二、目录 ref引用动态组件插槽自定义指令Table案例 ref引用 1.什么是ref引用 ref用来辅助开发者在不依赖于jQuery的…

基于Android的自助导游系统的设计与实现(论文+源码)_kaic

摘 要 随着人们的生活水平的提高&#xff0c;外出旅游已经成为人们放松休闲的主要活动之 一。传统的旅游方式都是团队组织&#xff0c;这在很大程度上制约了游客游玩的自主性。 本文充分利用无线互联网技术的优点&#xff0c;以智能手机作为移动终端&#xff0c;设计一款自助 …

react实现路由跳转动画

下载插件 npm i react-transition-group 配置路由 import { createBrowserRouter as ReactRouter,Navigate } from "react-router-dom";import App from ../App.js import Login from "../view/login.js"; import Home from "../home.js"; co…