【个人学习||算法】多维动态规划

【个人学习||算法】动态规划-CSDN博客

中介绍了动态规划,但是可以明显的发现,我只需要沿着一条数轴走就行了,例如走楼梯只需要向上走。而所谓的多维动态规划,就是不止一个维度,就像走地图一样方向可以改变。

但是本质上依旧没有改变

解题

要知道累计到现在的结果 ,我们就需要知道之前的累计结果

状态定义

先设f(x) 为当前数 参与的累计结果

状态转移方程

他的推导式子必定为f(x)= G(f(与以前某项关联))

初始化与边界

通过与以前项关联的个数推导出开始


1.不同路径

一个机器人位于一个 m x n网格的左上角 (起始点在下图中标记为 "Start" )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 "Finish" )。

问总共有多少条不同的路径?

解题:

要知道累计到现在的结果 ,我们就需要知道之前的累计结果

状态定义

f(i,j)是走到当前位置的路径

状态转移方程

走到当前方块可以由哪些地方走来呢?

题中说明每次只能向下或者向右移动一步

初始化与边界

由于里面存在两个参数可变,因此边界为

复制代码
class Solution {
    public int uniquePaths(int m, int n) {
        // 创建 dp 数组,dp[i][j] 表示到达 (i, j) 的路径总数
        int[][] dp = new int[m][n];

        // 初始化第一列:只能一路向下,路径数为 1
        for (int i = 0; i < m; i++) {
            dp[i][0] = 1;
        }
        // 初始化第一行:只能一路向右,路径数为 1
        for (int j = 0; j < n; j++) {
            dp[0][j] = 1;
        }

        // 填充其余格子
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                // 到达当前格子的路径 = 上方格子的路径 + 左方格子的路径
                dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
            }
        }

        return dp[m - 1][n - 1];
    }
}

2最小路径和

给定一个包含非负整数的 m xn 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

**说明:**每次只能向下或者向右移动一步。

解题:

状态定义

f(i,j)是走到当前位置的总和

状态转移方程

走到当前方块可以由哪些地方走来呢?

题中说明每次只能向下或者向右移动一步

初始化与边界

由于里面存在两个参数可变,因此边界为

复制代码
class Solution {
    public int minPathSum(int[][] grid) {
        if (grid == null || grid.length == 0 || grid[0].length == 0) {
            return 0;
        }

        int m = grid.length;
        int n = grid[0].length;
        int[][] dp = new int[m][n];

        // 1. 初始化起点
        dp[0][0] = grid[0][0];

        // 2. 初始化第一行 (只能向右)
        for (int j = 1; j < n; j++) {
            dp[0][j] = dp[0][j - 1] + grid[0][j];
        }

        // 3. 初始化第一列 (只能向下)
        for (int i = 1; i < m; i++) {
            dp[i][0] = dp[i - 1][0] + grid[i][0];
        }

        // 4. 填充其余网格
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                // 当前格子的最小路径和 = min(左方, 上方) + 当前格子值
                dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
            }
        }

        // 返回右下角的值
        return dp[m - 1][n - 1];
    }
}

3最长回文子串

给你一个字符串 s,找到 s 中最长的 回文 子串。

解题:

状态定义

f(i,j)表示字符串从 i 到 j 的子串是否为回文串(boolean)。

状态转移方程

走到当前方块可以由哪些地方走来呢?

题中说明每次只能向下或者向右移动一步

初始化与边界

由于里面存在两个参数可变,因此边界为

复制代码
class Solution {
    public String longestPalindrome(String s) {
        int n = s.length();
        if (n < 2) return s;

        boolean[][] dp = new boolean[n][n];
        int maxLen = 1;
        int begin = 0;

        // 初始化:所有长度为 1 的子串都是回文
        for (int i = 0; i < n; i++) {
            dp[i][i] = true;
        }

        // 这里的遍历顺序很重要:先枚举子串长度,或者从右下角向上遍历
        for (int j = 1; j < n; j++) {
            for (int i = 0; i < j; i++) {
                if (s.charAt(i) != s.charAt(j)) {
                    dp[i][j] = false;
                } else {
                    if (j - i < 3) {
                        dp[i][j] = true;
                    } else {
                        dp[i][j] = dp[i + 1][j - 1];
                    }
                }

                // 如果 dp[i][j] 是回文且长度大于当前最大值
                if (dp[i][j] && j - i + 1 > maxLen) {
                    maxLen = j - i + 1;
                    begin = i;
                }
            }
        }
        return s.substring(begin, begin + maxLen);
    }
}
相关推荐
Yanjun2i1 分钟前
Agent学习记录五:Pydantic验证
人工智能·python·学习
程序员阿鹏19 分钟前
为什么MySQL InnoDB选择B+树?
数据结构·数据库·b树·sql·mysql·算法·缓存
AI 思录40 分钟前
Prompt 事故档案(八):日常表达被标为“待校准”,AI 的爹味语法从哪里来
大数据·人工智能·算法·prompt·用户体验·ai合规
月光船幽幽1 小时前
跨范式映射的稳定接口设计
人工智能·python·算法
xqqxqxxq2 小时前
AI Agent学习:Agent协作工具技术笔记(李博杰《深入理解 AI Agent》4.6观后总结)
笔记·学习
白猫不黑2 小时前
大学网安方向学习路线:零基础与有基础的学习顺序整理
学习·web安全·计算机·网络安全·信息安全·编程·src漏洞
2601_965742222 小时前
全媒体运营与短视频代运营,两者有什么区别?
大数据·数据结构·人工智能·算法·ai·媒体
工业HMI实战笔记3 小时前
玩具制造HMI:注塑成型的快速换模与质量监控界面
人工智能·学习·交互·制造
wordbaby3 小时前
混合检索:两全其美的艺术
人工智能·算法
你在我身后3 小时前
发展路线建议
学习