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

3459. 最长 V 形对角线段的长度

Problem: 3459. 最长 V 形对角线段的长度

文章目录

  • 思路
  • 解题过程
  • 复杂度
  • Code

思路

记忆化搜索

解题过程

定义 dfs(i,j,k,canTurn,target) 表示在如下约束下的最长移动步数。
上一步的位置在 (i,j)。(定义成上一步,方便编程实现)
移动方向为 DIRS[k],其中 DIRS 是一个长为 4 的方向数组。
是否可以右转,用布尔值 canTurn 表示。
当前位置的目标值必须等于 target。

复杂度

  • 时间复杂度: O(mn)O(mn)O(mn)
  • 空间复杂度: O(mn)O(mn)O(mn)

Code

class Solution {static constexpr int DIRS[4][2] = {{1, 1}, {1, -1}, {-1, -1}, {-1, 1}};public:int lenOfVDiagonal(vector<vector<int>>& grid) {int m = grid.size(), n = grid[0].size();vector memo(m, vector<array<array<int, 2>, 4>>(n));auto dfs = [&](this auto&& dfs, int i, int j, int k, bool can_turn,int target) -> int {i += DIRS[k][0];j += DIRS[k][1];if (i < 0 || i >= m || j < 0 || j >= n || grid[i][j] != target) {return 0;}int& res = memo[i][j][k][can_turn];if (res) {return res;}res = dfs(i, j, k, can_turn, 2 - target) + 1; if (can_turn) {res = max(res, dfs(i, j, (k + 1) % 4, false, 2 - target) +1); }return res;};int ans = 0;for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (grid[i][j] == 1) {for (int k = 0; k < 4; k++) { ans = max(ans, dfs(i, j, k, true, 2) + 1);}}}}return ans;}
};
http://www.dtcms.com/a/354196.html

相关文章:

  • 设计模式理解
  • Nishang PowerShell工具:原理详解+使用方法+渗透实战
  • Go+Gdal 完成高性能GIS数据空间分析
  • 深度学习:常用的损失函数的使用
  • “java简单吗?”Java的“简单”与PHP的挑战:编程语言哲学-优雅草卓伊凡
  • 白话FNN、RNN、Attention和self-attention等
  • 《从有限元到深度学习:我的金属疲劳研究进阶之路》
  • 反内卷加速全产业链价值重塑 通威股份等行业龙头或率先受益
  • 基于 C# OpenCVSharp 的模板匹配检测技术方案
  • 计算机日常答疑,一起寻找问题的最优解
  • select
  • SM4加密算法
  • Karatsuba
  • 前端工程化与AI融合:构建智能化开发体系
  • 4-4.Python 数据容器 - 字典 dict(字典 dict 概述、字典的定义与调用、字典的遍历、字典的常用方法)
  • CPU 虚拟化之Cpu Models
  • 代码随想录刷题Day43
  • 时间轮定时器HashedWheelTimer
  • WSL设置静态IP
  • window程序打包
  • Libvio网站与客户端访问故障排查指南(专业版)
  • 什么是低空经济?
  • JMeter 5.3 性能测试:文件下载脚本编写与导出文件接收完整指南
  • QT鼠标事件中的QMouseEvent :e
  • 深度学习---卷积神经网络CNN
  • PLC_博图系列☞基本指令”S_ODT:分配接通延时定时器参数并启动“
  • HTML5超详细学习内容
  • 程序(进程)地址空间(1)
  • 基于MATLAB/Simulink的单机带负荷仿真系统搭建
  • LeetCode-23day:技巧经典