万物的开始,首先介绍一下动态规划(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 的一些笔记以及解题思路的更多相关文章

  1. 51nod 1118 机器人走方格 解题思路:动态规划 & 1119 机器人走方格 V2 解题思路:根据杨辉三角转化问题为组合数和求逆元问题

    51nod 1118 机器人走方格: 思路:这是一道简单题,很容易就看出用动态规划扫一遍就可以得到结果, 时间复杂度O(m*n).运算量1000*1000 = 1000000,很明显不会超时. 递推式 ...

  2. DP 状态 DP 转移方程 动态规划解题思路

    如何学好动态规划(2) 原创 Gene_Liu LeetCode力扣 今天 算法萌新如何学好动态规划(1) https://mp.weixin.qq.com/s/rhyUb7d8IL8UW1IosoE ...

  3. dp方法论——由矩阵相乘问题学习dp解题思路

    前篇戳:dp入门——由分杆问题认识动态规划 导语 刷过一些算法题,就会十分珍惜“方法论”这种东西.Leetcode上只有题目.讨论和答案,没有方法论.往往答案看起来十分切中要害,但是从看题目到得到思路 ...

  4. leedcode算法解题思路

    1.两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个 ...

  5. leetcode array解题思路

    Array *532. K-diff Pairs in an Array 方案一:暴力搜索, N平方的时间复杂度,空间复杂度N 数组长度为10000,使用O(N平方)的解法担心TLE,不建议使用,尽管 ...

  6. 听说你会打地鼠(动态规划dp)

    题目来源:https://biancheng.love/contest-ng/index.html#/41/problems G 听说你会打地鼠 时间限制:300ms   内存限制:65536kb 题 ...

  7. [LeetCode] Word Break 解题思路

    Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separa ...

  8. [LeetCode] 310. Minimum Height Trees 解题思路

    For a undirected graph with tree characteristics, we can choose any node as the root. The result gra ...

  9. [LeetCode] 45. Jump Game II 解题思路

    Given an array of non-negative integers, you are initially positioned at the first index of the arra ...

  10. 暑期培训7日游解题思路(day1~day3)

    暑期培训7日游解题思路(day1~day3) day1 第一天,王聿中老师出的题目比较简单,T1很水,T2是个简单的DP,T3还是有一点意思的.在网格图中删掉若干条边,使得所有格子都联通,求删掉的边的 ...

随机推荐

  1. 一键搞定发布自己Jar到Maven中央仓库

    做java 开发那当然离不开jar包管理, 不知何时一直想想封装一个自己的jar包 然后发布到maven中央仓库给别人使用. hhh 我感觉自己写一个jar包工具然后,被很多人使用是一件很牛,很快乐事 ...

  2. 配置http协议访问Harbor镜像仓库

    解决http: server gave HTTP response to HTTPS client问题,此问题在上传与下载时均可能出现. 由于docker镜像拉取与推送服务使用的是https协议,但是 ...

  3. 因为一条DDL,差点搞挂整个系统,这次真的长了教训

    有一次在线上提了一个sql变更,就是下面这条, -- 修改字段的数据类型由varchar(500)变更为text ALTER TABLE t MODIFY COLUMN name text; 提完之后 ...

  4. python:修改pdf的书签

    我觉得修改pdf书签总体来说最方便的方式就是: 导出pdf书签为文本文件,修改书签文本文件后再导入到pdf中. 1.直接修改pdf书签 python中比较好用的pdf处理的库是pymupdf: pip ...

  5. sshpass快速登录远程主机:s2

    #!/bin/bash passwd= if [ $# -ne 1 ] then echo "$0 [31|37|61]" fi if command -v sshpass the ...

  6. 2021-7-6 VUE笔记

    v-cloak:使用的display:none: 直到编译完成后开始显示: v-text和插值表达式,非必要响应式用v-text会比较好,使用插值表达式要加上v-cloak; v-html:不推荐使用 ...

  7. Pandas:删除最后一行

    解决方案 代码 效果展示 完整代码 import pandas as pd import numpy as np df = pd.DataFrame(np.arange(12).reshape(3,4 ...

  8. 快速掌握Vue3:速成Vue3前端开发看这篇就够啦

    一.Vue基本概念 1.1-Vue3的优点 Vue3支持Vue2额大多数特性. 更好的支持TypeScript. 打包大小减少41%. 初次渲染快55%,更新渲染快133%. 内存减少54%. 使用p ...

  9. 【Unity3D】平面光罩特效

    1 前言 ​ 屏幕深度和法线纹理简介中对深度和法线纹理的来源.使用及推导过程进行了讲解,激光雷达特效中讲述了一种重构屏幕像素点世界坐标的方法,本文将沿用激光雷达特效中重构像素点世界坐标的方法,实现平面 ...

  10. 1、MyBatis简介

    1.1.MyBatis历史 MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁 移到了Google Code. ...