动态规划 DP 的一些笔记以及解题思路
万物的开始,首先介绍一下动态规划(dynamic programming,DP)的基本概念:动态规划适用于有重叠子问题和最优子结构性质的问题,并且记录所有子问题的结果,因此动态规划方法耗费时间远远少于朴素解法。
动态规划总共可以分为4个步骤:1、定义子问题 2、写出子问题的递推关系 3、确定DP数组的计算顺序。4、空间优化。
步骤1:子问题与原问题相似,但是规模很小。子问题是参数化的,假设定义的子问题中参数为k。假设有n个房子,总共有n个子问题。动态规划实际上就是通过求解一堆子问题的解,来找出原问题的解。一个子问题的解是可以通过其他子问题的解求出。例如这道小偷问题中,f(k) 可以由 f(k - 1)和f(k - 2)求出。
步骤2:写出子问题的递推关系。设置有k间房子,那么偷k个房子,则有2种偷法,要不第k间房子被偷,要不第k-1间房子被偷。注意在写,递推关系的时候,写上边界情况,比如k = 0,k = 1的值。
步骤3:确定DP数组的计算顺序。此外,动态规划有自底向上和自顶向下两种解决问题的方法,自顶向下是记忆化(备忘录)递归,自底向上是递推、使用DP数组的循环方法。DP 数组也可以叫”子问题数组”,那么,只要搞清楚了子问题的计算顺序,就可以确定 DP 数组的计算顺序。对于小偷问题,我们分析子问题的依赖关系,发现每个f(k) 依赖 f(k -1) 和 f(k - 2)。也就是说, dp[k] 依赖 dp[k-1] 和 dp[k-2]。
步骤4:空间优化的基本原理是,很多时候并不需要始终持有全部的 DP数组。对于小偷问题,我们发现,最后一步计算 f(n)的时候实际上只用到了 f(n-1)和 f(n- 2)的结果,n- 3之前的子问题,实际上早就已经用不到了。那么,可以只用两个变量保存两个子问题的结果,就可以依次计算出所有的子问题。
class Solution {
public int rob(int[] nums) {
// 长度为空
if(nums.length == 0) return 0;
int N = nums.length;
int[] dp = new int[N+1];
dp[0] = 0;
dp[1] = nums[0];
for(int k = 2;k<N+1;k++){
dp[k] = Math.max(dp[k-1],nums[k-1] + dp[k-2]);
}
return dp[N];
}
}
动态规划 DP 的一些笔记以及解题思路的更多相关文章
- 51nod 1118 机器人走方格 解题思路:动态规划 & 1119 机器人走方格 V2 解题思路:根据杨辉三角转化问题为组合数和求逆元问题
51nod 1118 机器人走方格: 思路:这是一道简单题,很容易就看出用动态规划扫一遍就可以得到结果, 时间复杂度O(m*n).运算量1000*1000 = 1000000,很明显不会超时. 递推式 ...
- DP 状态 DP 转移方程 动态规划解题思路
如何学好动态规划(2) 原创 Gene_Liu LeetCode力扣 今天 算法萌新如何学好动态规划(1) https://mp.weixin.qq.com/s/rhyUb7d8IL8UW1IosoE ...
- dp方法论——由矩阵相乘问题学习dp解题思路
前篇戳:dp入门——由分杆问题认识动态规划 导语 刷过一些算法题,就会十分珍惜“方法论”这种东西.Leetcode上只有题目.讨论和答案,没有方法论.往往答案看起来十分切中要害,但是从看题目到得到思路 ...
- leedcode算法解题思路
1.两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个 ...
- leetcode array解题思路
Array *532. K-diff Pairs in an Array 方案一:暴力搜索, N平方的时间复杂度,空间复杂度N 数组长度为10000,使用O(N平方)的解法担心TLE,不建议使用,尽管 ...
- 听说你会打地鼠(动态规划dp)
题目来源:https://biancheng.love/contest-ng/index.html#/41/problems G 听说你会打地鼠 时间限制:300ms 内存限制:65536kb 题 ...
- [LeetCode] Word Break 解题思路
Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separa ...
- [LeetCode] 310. Minimum Height Trees 解题思路
For a undirected graph with tree characteristics, we can choose any node as the root. The result gra ...
- [LeetCode] 45. Jump Game II 解题思路
Given an array of non-negative integers, you are initially positioned at the first index of the arra ...
- 暑期培训7日游解题思路(day1~day3)
暑期培训7日游解题思路(day1~day3) day1 第一天,王聿中老师出的题目比较简单,T1很水,T2是个简单的DP,T3还是有一点意思的.在网格图中删掉若干条边,使得所有格子都联通,求删掉的边的 ...
随机推荐
- Redis基础(二)——列表操作、redis管道、Django中使用redis
Redis列表操作 ''' lpush(name,values) rpush(name, values) 表示从右向左操作 lpushx(name,value) rpushx(name, value) ...
- AI-4多层感知机
4.1笔记 在线性网络中,任何特征的增大都会导致模型输出的增大或减小.这种想法在某些情况下不在适用,例如x和y并非线性关系.或者是x和y并不具有单调性.以及x1.x2会对y产生交互作用时. 为解决该问 ...
- JavaCV的摄像头实战之十二:性别检测
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是<JavaCV的摄像头实战> ...
- 前端:Uncaught TypeError: Cannot set property 'value' of null;
1.在写JS代码中的绑定事件时(将JS与HTML标签分开时),发现会有如下错误提示: Uncaught TypeError: Cannot set property 'onclick' of null ...
- LocalTime转String类型,如下图
- freeswitch的mod_cdr_csv模块
概述 freeswitch是一款简单好用的VOIP开源软交换平台. 在语音呼叫的过程中,话单是重要的计价和结算依据,话单的产生需要稳定可靠,可回溯. fs中基本的话单模块mod_cdr_csv,可以满 ...
- Spring的Bean标签配置(一)
Bean标签基本配置 由于配置对象交由Spring来创建 默认情况下它调用的的是类中的无参构造函数,如果没有无参构造函数则不会创建成功 id:唯一标识符号,反射是通过无参构造创建对象的. class: ...
- 快速了解DevSecOps:构建安全软件开发的基石!
关键词 DevSecOps - 在不影响敏捷性的前提下,将安全充分融入到SDLC的所有环节中 SDLC-软件交付生命周期 SCA-软件组成分析-用于识别和检测软件中使用的开源/第三方组件的已知安全漏洞 ...
- [windows]远程桌面失败提示CredSSP加密修正
前言 windows远程桌面失败,提示"CredSSP加密--" 远程桌面服务器的系统版本:Windows Server 2016 本地电脑的系统版本:Windows 10 方式1 ...
- C#是否应该限制链式重载的设计模式?
1.代码的可阅读性 一眼看懂是什么意思,并且能看出生成的SQL是什么样的 var list = db.Queryable<Student>() .GroupBy(it => it.N ...