分析&回答


动态规划算法将待求解问题拆分成一系列相互交叠的子问题,通过递推关系定义各子问题的求解策略,并随时记录子问题的解,最终获得原始问题的解,避免了对交叠子问题的重复求解。

在动态规划算法中有三要素:

  1. 最优子结构: 是指每个阶段的最优状态可以从之前某个阶段的某个或某些状态直接得到
  2. 边界: 是指问题最小子集的解
  3. 状态转移函数: 是指从一个阶段向另一个阶段过渡的具体模式,描述的是两个相邻子问题之间的关系

动态规划算法解决问题 (接雨水)

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

class Solution {public int trap(int[] height) {int n = height.length;if (n == 0) {return 0;}int[] leftMax = new int[n];leftMax[0] = height[0];for (int i = 1; i < n; ++i) {leftMax[i] = Math.max(leftMax[i - 1], height[i]);}int[] rightMax = new int[n];rightMax[n - 1] = height[n - 1];for (int i = n - 2; i >= 0; --i) {rightMax[i] = Math.max(rightMax[i + 1], height[i]);}int ans = 0;for (int i = 0; i < n; ++i) {ans += Math.min(leftMax[i], rightMax[i]) - height[i];}return ans;}
}

动态规划算法解决问题 (爬楼梯)

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 12 个台阶。你有多少种不同的方法可以爬到楼顶呢?


class Solution {public int climbStairs(int n) {int p = 0, q = 0, r = 1;for (int i = 1; i <= n; ++i) {p = q; q = r; r = p + q;}return r;}
}

动态规划算法解决问题 (买卖股票的最佳时机)

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。

你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。

返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。

public class Solution {public int maxProfit(int[] prices) {int len = prices.length;if (len < 2) {return 0;}int[] have = new int[len];  // 表示第i天持有股票所得最多现金int[] no = new int[len];    // 表示第i天不持有股票所得最多现金have[0] = -prices[0]; // 此时的持有股票就一定是买入股票了no[0] = 0;            // 不持有股票那么现金就是0for (int i = 1; i < len; i++) {have[i] = Math.max(have[i-1], -prices[i]);no[i] = Math.max(no[i-1], prices[i] + have[i-1]);}return no[len - 1];}
}

题目代码出自LeetCode,请自行查阅。

反思&扩展


其他应用

  • 爬楼梯问题
  • 背包问题
  • 最长递归子序列(回文串)问题

为了大家更加方便的刷题,我们对文章进行了分类和整理,免费为大家提供刷题服务。程序员不欺骗程序员,赶紧扫码小程序刷起来!

为了一站式解决面者刷题问题,部分内容可能存在摘录情况,如有侵权辛苦您留言联系我们,我们会删除文章或添加引用文案,Thanks!

算法核心-动态规划算法相关推荐

  1. 完全背包问题贪心算法c语言,数据结构与算法学习之路:背包问题的贪心算法和动态规划算法...

    一.背包问题描述: 有N种物品和一个重量为M的背包,第i种物品的重量是w[i],价值是p[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包重量,且价值总和最大. 二.解决方法: 1.贪心算 ...

  2. C++算法学习(动态规划算法)

    动态规划算法 1.目标 2.方法 3.过程 4.例题 (1)[力扣:5. 最长回文子串](https://leetcode-cn.com/problems/longest-palindromic-su ...

  3. 算法之动态规划算法简介

    动态规划概述 算法,是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制.在现实生活中,算法具有如下一些特征: 有穷性:指算法必须能在执行有限个步骤 ...

  4. 算法:动态规划算法的最佳实践-背包问题

    1.背包问题 有一个背包,容量为4磅,现有如下物品 要求达到的目标为装入的背包的总价值最大 并且重量不超出要求装入的物品不能重复 2.思路分析 背包问题主要是指一个给定容量的背包.若干具有一定价值和重 ...

  5. DP算法:动态规划算法

    步骤 (1)确定初始状态 (2)确定转移矩阵,得到每个阶段的状态,由上一阶段推到出来 (3)确定边界条件. 例题 蓝桥杯--印章(python实现) 使用dp记录状态,dp[i][j]表示买i张印章, ...

  6. 学习进度2012-6-26(动态规划算法、Prim算法、Dijkstra算法)

    今天学习下三个算法:动态规划算法.Prim算法.Dijkstra算法,将自己理解的逻辑略作总结. 1.动态规划算法是选取两个字符串的最长子序列的解法作为切入点学习,在公司午休时间将代码写了下,初步测试 ...

  7. java数据结构-动态规划算法-一次性学会

    java数据结构-动态规划算法 算法介绍 最佳实践-背包问题 代码实践 寻找最长回文子串的求解 总结 算法介绍 动态规划算法的核心思想是:将大问题划分为小问题,一步步获取最优解 与分治算法类似,但也有 ...

  8. 用动态规划算法实现最长公共子序列问题的算法(java实现)

    用动态规划算法实现最长公共子序列问题的算法 public class longestCommonSubsequence {//构造追踪数组rec,记录子问题来源private static Strin ...

  9. tsp问题动态规划python_用Python解决TSP问题(2)——动态规划算法

    本介绍用python解决TSP问题的第二个方法--动态规划法 算法介绍 动态规划算法根据的原理是,可以将原问题细分为规模更小的子问题,并且原问题的最优解中包含了子问题的最优解.也就是说,动态规划是一种 ...

最新文章

  1. [Android]Android端ORM框架——RapidORM(v1.0)
  2. 转载——CVE-2019-0807
  3. qt中设置父窗口中某一控件样式后,子窗口中某一控件也随父控件样式
  4. Windows常用命令集
  5. MiniO纠删码快速入门
  6. js怎么动态加载js文件(JavaScript性能优化篇)
  7. POJ 3254 poj3254 Corn Fields
  8. kafka监控工具Burrow安装
  9. 【水果识别】基于matlab GUI HSV+RGB水果分类【含Matlab源码 380期】
  10. 政企数字化转型怎么做?先从华为云WeLink “云签约”打个样儿
  11. Golang-PKCS8
  12. OpenCV 基础(二) 显示图片
  13. 计算机屏幕怎么设置键盘,[怎么用屏幕键盘]怎么用键盘调屏幕分辨率
  14. 制作App,免编程积木式搭建如此之简单
  15. 如何安装cygwin
  16. HCL模拟器的使用心得
  17. 矩阵连乘——动态规划算法
  18. 如何配置系统数据库服务器地址,如何配置系统数据库服务器地址
  19. 深度学习100题(1)
  20. ESB实现SOA架构

热门文章

  1. 计网复习——传输层习题
  2. 新手程序员去哪里?避雷小技巧交给你
  3. 针对MacBook提示目前翻译不可用请稍后再试的解决方法
  4. 遍历Lua全局环境变量
  5. “网上世博会”带来创新体验,水晶石着力推动“数字展览”应用
  6. 云服务器有什么用途?新手如何使用云服务器
  7. NB-IoT是什么?
  8. 卧底“刷量”卖家,有关微信公众号“刷量”的五个劲爆事实
  9. 便宜的Android手机值得吗?
  10. Ubuntu升级glibc库