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

Leetcode 3459. Length of Longest V-Shaped Diagonal Segment

  • Leetcode 3459. Length of Longest V-Shaped Diagonal Segment
    • 1. 解题思路
    • 2. 代码实现
  • 题目链接:3459. Length of Longest V-Shaped Diagonal Segment

1. 解题思路

这一题我的思路上就是一个动态规划加上剪枝的思路。

首先,不难给出一个动态规划算法来考察每一个位置作为起始点时其所能获得的最大V字路径长度,但是,贸然地动态规划会出现超时的问题。

因此,我们需要对其进行一下合理的剪枝,具体来说,就是考察一下每一个位置所能获得的最大路径长度,如果当前计算得到的路径长度已经大于等于其所能获得的最大路径长度了,那我们就不需要考察当前作为作为起点时的情况了。

2. 代码实现

给出python代码实现如下:

class Solution:
    def lenOfVDiagonal(self, grid: List[List[int]]) -> int:
        n, m = len(grid), len(grid[0])
        next_direction = {
            (1, 1): (-1, 1),
            (1, -1): (1, 1),
            (-1, 1): (-1, -1),
            (-1, -1): (1, -1)
        }

        @lru_cache(None)
        def dp(i, j, turn, dx, dy):
            if turn == 0:
                ans = 1
                while 0 <= i+dy < n and 0 <= j+dx < m and grid[i+dy][j+dx] == 2-grid[i][j]:
                    ans += 1
                    i, j = i+dy, j+dx
                return ans
            if grid[i][j] == 1:
                ans = 1
                for dx, dy in [(1, 1), (1, -1), (-1, 1), (-1, -1)]:
                    if 0 <= i+dy < n and 0 <= j+dx < m and grid[i+dy][j+dx] == 2:
                        ans = max(ans, 1 + dp(i+dy, j+dx, 1, dx, dy))
                return ans
            
            ans = 1
            if 0 <= i+dy < n and 0 <= j+dx < m and grid[i+dy][j+dx] == 2-grid[i][j]:
                ans = max(ans, 1 + dp(i+dy, j+dx, 1, dx, dy))
            dx, dy = next_direction[(dx, dy)]
            if 0 <= i+dy < n and 0 <= j+dx < m and grid[i+dy][j+dx] == 2-grid[i][j]:
                ans = max(ans, 1 + dp(i+dy, j+dx, 0, dx, dy))
            return ans
        
        ans = 0
        for i in range(n):
            for j in range(m):
                if grid[i][j] == 1:
                    if ans >= max(min(n-i+1, m-j+m), min(i+1, j+m), min(i+n, m-j+1), min(n-i+n, j+1)):
                        continue
                    ans = max(ans, dp(i, j, 1, 1, 1))
                    if ans == max(min(n, 2*m-1), min(m, 2*n-1)):
                        break
        return ans

提交代码评测得到:耗时8412ms,占用内存156MB。


http://www.kler.cn/a/551460.html

相关文章:

  • 大数据学习(48) - Flink状态种类
  • 李代数和李群的转化方法
  • Openssl交叉编译
  • 项目流程图
  • BSD协议栈:UDP发送
  • Python中通过Pymysql连接MySQL
  • SoftwareCluster中如何配置VendorSignature
  • 机器学习_14 随机森林知识点总结
  • flink反压详解
  • Android 10.0 移除wifi功能及相关菜单
  • Android中kotlin的Map简单使用方法
  • 【现代深度学习技术】深度学习计算 | GPU
  • STM32 ADC介绍(硬件原理篇)
  • Linux的SSH无法连接(shell request failed on channel 0)
  • Dockerfile 详解:构建自定义镜像
  • AUTO TECH China 2025 广州国际汽车技术展览会:引领汽车科技新潮流
  • 日常问题-pnpm install执行没有node_modules生成
  • OpenHarmony 系统性能优化——默认关闭全局动画
  • DeepSeek教unity------Dotween
  • 网络安全学习笔记之Internet基本知识