当前位置: 首页 > news >正文

算法(动态规划)

动态规划

基本思想

将问题分解为相互重叠的子问题

  1. 定义子问题:将原问题分解为若干个子问题。
  2. 确定状态转移方程:找到子问题之间的递推关系。
  3. 边界条件:确定初始状态的值。
  4. 递推计算:根据状态转移方程和边界条件逐步计算子问题的解。

应用场景

  1. 最短路径问题
  2. 最长公共子序列:求解两个序列的最长公共子序列。
  3. 字符串编辑距离:求解两个字符串之间的编辑距离。

五部曲

  1. 确定dp数组以及下标的含义
  2. 确定递推公式
  3. dp数组如何初始化
  4. 确定遍历顺序
  5. 举例推导dp数组

常见算法

爬楼梯

class Solution {
    public int climbStairs(int n) {
        int[] dp = new int[n + 1];
        dp[0] = 1;
        dp[1] = 1;
        for(int i = 2; i <= n; i++) {
            dp[i] = dp[i - 1] + dp[i - 2];
        }
        return dp[n];
    }
}

斐波那契数列

public class Fibonacci {
    public static int fib(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];
    }

    public static void main(String[] args) {
        int n = 10;
        System.out.println("Fibonacci(" + n + ") = " + fib(n));
    }
}

最长公共子序列

public class LongestCommonSubsequence {

    public static int lcs(String s1, String s2) {
        int m = s1.length();
        int k = s2.length();

        int[][] dp = new int[m + 1][k + 1];

        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= k; j++) {
                if (s1.charAt(i - 1) == s2.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][k];
    }

    public static void main(String[] args) {
        String s1 = "ABCBDAB";
        String s2 = "BDCABA";
        System.out.println("最长公共子序列长度:" + lcs(s1, s2));
    }
}

相关文章:

  • elasticsearch索引数据备份与恢复
  • Python基于OpenCV和SVM实现中文车牌识别系统GUI界面
  • 【STL 之速通pair vector list stack queue set map 】
  • Linux系统学习Day04 阻塞特性,文件状态及文件夹查询
  • LeetCode 416、606题解(中等dp、回溯)
  • FPGA_DDR(一) 仿真
  • continew-admin的报错问题
  • HTTPS在信息传输时使用的混合加密机制,以及共享、公开密钥加密的介绍。
  • Java Flow 编程:异步数据流介绍
  • 学习日记-0407(Inductive Matrix Completion Using Graph Autoencoder)
  • C盘清理——快速处理
  • SOLIDWORKS 2025教育版有效的数据管理与团队协作
  • Android studio学习之路(六)--真机的调试以及多媒体照相的使用
  • NXP i.MX 平台下双平台设备驱动解析:`imx-lcdifv3` 与 `imx-drm` 的实战解剖
  • Android 学习之 Navigation导航
  • 实时图表工具GLG Toolkit 在 Web HMI/SCADA 领域的卓越实践
  • ubuntu wifi配置(命令行版本)
  • 设计模式之解释器模式:原理、实现与应用
  • 大数据(5)Spark部署核弹级避坑指南:从高并发集群调优到源码级安全加固(附万亿级日志分析实战+智能运维巡检系统)
  • 【项目管理】第4章 信息系统管理 --知识点整理
  • 网站建设协议书/郑州seo优化大师
  • 网站建设上门按摩哪家好/网站网络排名优化方法
  • 国内买机票的网站建设/营业推广的方式
  • wordpress调用页面标题/北京网站优化专家
  • 网站开发与设计这么样/seo优化诊断
  • ie兼容性 网站/江苏网站seo设计