【动态规划】矩阵
矩阵
矩阵相关的典型应用如下:
序号 | 题目 |
---|---|
1 | 174. 地下城游戏 |
2 | 562. 矩阵中最长的连续1线段 |
应用
应用1:Leetcode.174
题目
分析
省略。
代码实现
class Solution: def uniquePaths(self, m: int, n: int) -> int: dp = [[0 for _ in range(n)] for _ in range(m)] for i in range(m): dp[i][0] = 1 for i in range(n): dp[0][i] = 1 for i in range(1, m): for j in range(1, n): dp[i][j] = dp[i - 1][j] + dp[i][j - 1] return dp[m - 1][n - 1]
应用2:Leetcode.562
题目
解题思路
动态规划
假设
:以 结尾的水平线段最长 的线段长度; :以 结尾的主对角线段最长 的线段长度; :以 结尾的垂直线段最长 的线段长度; :以 结尾的反对角线段最长 的线段长度;
注意,状态
边界条件
当矩形大小为零时,最长
状态转移
考虑从左上往右下遍历矩阵,对于
因此,对于
- 如果当前位置
的值为 ,那么,存在如下状态转移过程:
- 如果当前位置
的值为 ,那么,以 结尾的线段长度都是 ,即
假设矩阵的大小为
我们以下面的矩阵为例,介绍转移过程:
其状态转移过程如下:
因为我们是从左上向右下遍历矩阵,因此,图中的
代码
class Solution: def longestLine(self, mat: List[List[int]]) -> int: m, n = len(mat), len(mat[0]) dp = [[ [0] * 4 for _ in range(n + 2)] for _ in range(m + 2)] result = 0 for i in range(1, m + 1): for j in range(1, n + 1): if mat[i - 1][j - 1] == 1: dp[i][j][0] = dp[i][j - 1][0] + 1 dp[i][j][1] = dp[i - 1][j - 1][1] + 1 dp[i][j][2] = dp[i - 1][j][2] + 1 dp[i][j][3] = dp[i - 1][j + 1][3] + 1 result = max(result, dp[i][j][0], dp[i][j][1], dp[i][j][2], dp[i][j][3]) return result
本文作者:LARRY1024
本文链接:https://www.cnblogs.com/larry1024/p/17061263.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步