动态规划算法简单介绍

server/2024/9/24 2:07:16/

动态规划(Dynamic Programming,DP)是一种用于解决具有重叠子问题和最优子结构性质的问题的算法技术。它通过将复杂问题分解为更简单的子问题,并利用子问题的解来构建原问题的解,从而避免重复计算,提高效率。

动态规划的基本思想

动态规划的核心思想是通过分治和记忆化(即存储子问题的解),避免重复计算,从而提高算法的效率。动态规划一般包括以下几个步骤:

  1. 定义子问题:将原问题分解为一系列子问题。
  2. 递推关系:找到子问题之间的关系,建立递推公式。
  3. 边界条件:确定子问题的初始条件(即边界条件)。
  4. 计算顺序:确定计算子问题的顺序(通常是自底向上,或者递归加记忆化)。

动态规划的实现方式

动态规划有两种实现方式:自顶向下的递归加记忆化(Memoization)和自底向上的迭代(Tabulation)。

示例问题

以下是一些经典的动态规划问题及其解决方案:

1. 斐波那契数列

斐波那契数列是一个简单的动态规划问题,目标是计算第 𝑛n 个斐波那契数。

递归加记忆化
import java.util.HashMap;
import java.util.Map;public class FibonacciMemoization {private static Map<Integer, Integer> memo = new HashMap<>();public static void main(String[] args) {int n = 10;System.out.println(fibonacci(n)); // 输出第10个斐波那契数}public static int fibonacci(int n) {if (n <= 1) {return n;}if (memo.containsKey(n)) {return memo.get(n);}int result = fibonacci(n - 1) + fibonacci(n - 2);memo.put(n, result);return result;}
}

自底向上
public class FibonacciTabulation {public static void main(String[] args) {int n = 10;System.out.println(fibonacci(n)); // 输出第10个斐波那契数}public static int fibonacci(int n) {if (n <= 1) {return n;}int[] dp = new int[n + 1];dp[0] = 0;dp[1] = 1;for (int i = 2; i <= n; i++) {dp[i] = dp[i - 1] + dp[i - 2];}return dp[n];}
}

2. 最长公共子序列(LCS)

最长公共子序列问题是另一个经典的动态规划问题。给定两个字符串,找到它们的最长公共子序列的长度。

动态规划实现
public class LongestCommonSubsequence {public static void main(String[] args) {String text1 = "abcde";String text2 = "ace";System.out.println(longestCommonSubsequence(text1, text2)); // 输出 3}public static int longestCommonSubsequence(String text1, String text2) {int m = text1.length();int n = text2.length();int[][] dp = new int[m + 1][n + 1];for (int i = 1; i <= m; i++) {for (int j = 1; j <= n; j++) {if (text1.charAt(i - 1) == text2.charAt(j - 1)) {dp[i][j] = dp[i - 1][j - 1] + 1;} else {dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);}}}return dp[m][n];}
}

动态规划的应用

动态规划可以应用于许多问题,包括但不限于:

  • 背包问题:如 0/1 背包问题、完全背包问题等。
  • 字符串问题:如最长公共子序列、最长回文子序列、编辑距离等。
  • 序列问题:如最长递增子序列、股票买卖问题等。
  • 路径问题:如最短路径问题、最大路径和问题等。

总结

动态规划是一种强大的算法技术,适用于解决具有重叠子问题和最优子结构性质的问题。通过定义子问题、找到递推关系、确定边界条件和计算顺序,可以有效地解决许多复杂问题。


http://www.ppmy.cn/server/42952.html

相关文章

工具分享:VsCode注释神器,koro1FileHeader

他是有官方Wiki的。 https://github.com/OBKoro1/koro1FileHeader/wiki/ 项目在GitHub上开源。以下摘录部分wiki&#xff0c;用作介绍分享在这里插入代码片 如何找到setting.json设置模板 简单的输入命令 打开VSCode命令面板: mac: command p window: ctrl p输入> Ope…

JMH 微基准测试(性能测试)

写本文主要是简单记录一下JMH的使用方式。JMH全名是Java Microbenchmark Harness&#xff0c;主要为在jvm上运行的程序进行基准测试的工具。作为一个开发人员&#xff0c;在重构代码&#xff0c;或者确认功能的性能时&#xff0c;可以选中这个工具。 本文场景&#xff1a;代码重…

Elasticsearch集群部署以及认证配置

目录 文档地址&#xff1a; 源码安装-环境准备&#xff1a; 解压ES源码包 修改ES集群配置文件 安全认证操作步骤 在192.168.95.174 node-01节点操作 将节点node-01上生成的两个文件拷贝到另外的节点 启动ES集群服务 1、创建用户 2、启动 设置es密码 用过用户名密码验…

Linux 内核开发 27 POSIX共享内存

Linux 内核开发 27 POSIX共享内存 1.定义 支持 POSIX 共享内存&#xff0c;linux 内核使用的是通过一个名为tmpfs的特殊文件系统来实现内存共享&#xff0c;并且将文件系统挂载在rootfs的/dev/shm上。 这种实现与linux 文件系统api 相互一致&#xff0c;所以每个文件都有inod…

接口测试及接口测试常用的工具详解

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 首先&#xff0c;什么是接口呢&#xff1f; 接口一般来说有两种&#xff0c;一种是程序内部的接口&#xff0c;一种是系统对外的接口。 系统对外的接口&#xff1a;比如你要从别的网站或服务器上获取资源或信息…

华为CE6851-48S6Q-HI升级设备版本及补丁

文章目录 升级前准备工作笔记本和交换机设备配置互联地址启用FTP设备访问FTP设备升级系统版本及补丁 升级前准备工作 使用MobaXterm远程工具连接设备&#xff0c;并作为FTP服务器准备升级所需的版本文件及补丁文件 笔记本和交换机设备配置互联地址 在交换机接口配置IP&#…

Stable Diffusion【提示词】【视觉设计】:多面板墙壁艺术

大模型&#xff1a;RealVisXL V4.0 提示词 Multi panel wall art of [Subject], style of digital art, living room, high definition, 8k [主题]的多面板墙壁艺术&#xff0c;数字艺术风格&#xff0c;客厅&#xff0c;高清&#xff0c;8k 参数设置 大模型&#xff1a;Re…

Fastjson漏洞之CVE-2017-18349

前言&#xff1a; 要想理解漏洞原理&#xff0c;首先看看Fastjson是什么&#xff0c;具体用来做什么才能更好的找到可以利用的场景&#xff1a; Fastjson 是一个由阿里巴巴开发的 Java 语言实现的高性能 JSON 解析器和生成器。它具有以下特点: 快速&#xff1a;Fastjson 在序列…