LeetCode-DP系列
乐行僧丶
这个作者很懒,什么都没留下…
展开
-
DP-LeetCode-152. 乘积最大子数组
思路 数组中有负有正有0 状态表示 f[i] : 表示从[0, i]数组乘积的最大值 g[i] : 表示从[0, i]数组乘积的最小值 状态计算 通过i-1的状态递推i 对于f[i] f[i]只考虑自己,则f[i] = nums[i] nums[i] > 0 f[i] = f[i - 1] * nums[i] nums[i] < 0 f[i] = g[i - 1] * nums[i] nums[i] == 0 综上f[i]是上面几种情况的最大值 对于g[i] g[i]只考虑自己,则g[i]原创 2021-11-27 09:00:16 · 121 阅读 · 0 评论 -
DP-LeetCode-45. 跳跃游戏 II
class Solution { public: int jump(vector<int>& nums) { // 起跳点的范围[st, ed) int st = 0; // int ed = 1; int ans = 0; while (ed < nums.size()) { int maxPos = 0; // 更新最远的跳跃距离原创 2021-11-26 19:16:04 · 207 阅读 · 0 评论 -
DP-LeetCode-918. 环形子数组的最大和
思路 最大子数组的满足的条件 [x x x x (正x x x x x x x x x 正)x x x x ],两边一定是正数,如果至少有一个负数,会是的整个子数组和变小。 [x x x x 负(正x x x x x x x x x 正)负 x x x x ],子数组两个边界外的数字一定是负数,如果是整数,一定会被扩充到子数组中,使得子数组和变的更大,是0不影响 环形数组一定包括两个边界,所以它的形式是[x x x x 正(负x x x x x x x x x 负)正 x x x x ],其中(负x原创 2021-11-26 08:37:08 · 257 阅读 · 0 评论 -
DP-LeetCode-3. 最大子序和
思路代码 状态表示 当前位置为i,last表示[0, i-1]的最大子序和 now表示[0, i]的最大子序和,如果想让当前的now更大,那么last需要>=0 状态计算 now = max(0, last) + nums[i] 状态计算 class Solution { public: int maxSubArray(vector<int>& nums) { int last = 0; int ans = INT_MIN;原创 2021-11-25 23:24:18 · 315 阅读 · 0 评论 -
DP-LeetCode-55. 跳跃游戏
题目: 给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标。 思路: 能跳到的位置一定是连续的一段,也就不是不会出现可以跳到某个点j,但是不能跳到某个点之前的那个点j-1。 反证法:假设现在可以跳到可以跳到某个点j,但是不能跳到某个点之前的那个点j-1。 那么这个可以跳到的点j一定是从之前的某个点i加上之前某个点i所能跳的步数nums[i]得到的。如果让这个点i加上之前这个点i所能跳的步数nums[i] -原创 2021-11-24 07:37:14 · 2851 阅读 · 0 评论 -
DP-LeetCode-740. 删除并获得点数
思路 有限制的选择问题 选择i就要删除所有的i-1和i+1 讨论当前状态i (1)如果选择了i,则i+1不能选 (2)如果不选择i,则i+1可以选也可以不选 状态表示: f[i][0]表示只考虑前i个数,不选择i所有选法中所能得到的最大值; f[i][1]表示只考虑前i个数,选择i所有选法中所能得到的最大值; 状态计算: 如果当前i不选,则考虑前i-1个数所能获得的最大值。这时有需要考虑选择不选i-1,如果选择i-1则前i-1个数所能获得的最大值就是f[i-1][1];如果不选择i-1则前i-1个数所原创 2021-11-23 18:01:11 · 258 阅读 · 0 评论 -
DP-LeetCode-213. 打家劫舍 II
思路: 与上一题不同的是,这题增加了一个新的限制条件,就是最后一间房子和第一间房子是相连的,意味对于最后一间房和第一间房子只能偷最多只能偷其中的一家,因此最后一间房子和第一间房子需要进行特殊判断。 DP转移方程 主体还是使用f[i]和g[i]表示偷和不偷当前(i)房子能够偷的最大值。 特判最后一间房和第一间房子: (1)第一间房子不偷,最后一间房子可以偷可以不偷。 (1)第一间房子偷,最后一间房子一定不能偷。 代码: class Solution { public: int rob(vector&l原创 2021-11-23 09:20:24 · 222 阅读 · 0 评论 -
DP-LeetCode-198. 打家劫舍
题目 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/house-robber 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 思想 闫氏原创 2021-11-22 22:31:10 · 116 阅读 · 0 评论 -
DP-LeetCode-746. 使用最小花费爬楼梯
思想: 闫氏DP法 状态表示 集合:f[i]表示到第i阶所花费最小的体力值 属性:min 状态计算 当前第n阶台阶可以从第n-1阶台阶爬一阶或者第n-2阶台阶爬两阶到达第n阶。 所花费的体力的最小值是(从第n-1阶台阶爬一阶或者第n-2阶台阶爬两阶到达第n阶中体力最小值) 加上当前层所有要的体力消耗。 状态转移方程,f[i] = min(f[i - 1], f[i - 2]) + cost[i]; class Solution { public: int minCostClimbingStair原创 2021-11-22 22:15:05 · 273 阅读 · 0 评论 -
DP-LeetCode-70. 爬楼梯
思路: 本质就是斐波那契数列,详细看第一篇 这里的状态转移方程 f[0] = 1; f[2] = 2; f[n] = f[n-1] + f[n-2] f[n] = f[n-1] + f[n-2]如何理解? 爬楼梯一次可以一阶或者两阶,怕到第n层台阶有多少种方案。 逆向思考,当现在处于第n阶台阶,从哪里可以到这里呢? 从n-1阶台阶爬一层到这里或者从n-2阶台阶爬两层到这里,也就爬到第n的方案数是爬到第n-1阶台阶的方案数与爬到第n-2阶台阶的方案数之和,加法原理。 代码 class Solution {原创 2021-11-22 07:34:45 · 154 阅读 · 0 评论 -
DP-1137. 第 N 个泰波那契数
思路 斐波那契数列的扩展版,具体看上一题 时间复杂度:O(n) 空间复杂度:O(1) 代码 class Solution { public: int tribonacci(int n) { if (n == 0) { return 0; } else if (n == 1) { return 1; } else if (n == 2) { return 1; }原创 2021-11-21 21:26:10 · 246 阅读 · 0 评论 -
DP-LeetCode-509. 斐波那契数
思路: 斐波那契数列明确给出了递推方程(状态转移方程)。 f[0] = 0 f[1] = 1 n>=2 f[n] = f[n - 1] + f[n - 1] 优化: 一维数组压缩为三个变量,因为从递推方程中观察到当前n的状态至于前一项和前两项相关,所以只需要记录当前项的前两项进行递推即可。 时间复杂度:O(n) 空间复杂度:O(1) 代码 class Solution { public: int fib(int n) { if (n == 0) {原创 2021-11-21 21:19:52 · 182 阅读 · 0 评论