40 从经典力扣题发掘DFS与记忆化搜索的本质 -从矩阵最长递增路径入手 一步步探究dfs思维优化与编程深度思考

1引子:

DFS和递归法的一道经典例题矩阵最长递增子序列这个题写完之后脑袋产生了许多突发奇想:


1 第一个堆栈代码段这些底层C语言内部管理的工具它是怎么进行内存分配的?能不能深究?
2 第二个这个DFS和计划数组存储的思路到底抽象了哪种思维?能不能发散到其他算法数据结构的面试题中?或者说能不能在其他的编程中应用到这种思维抽象出一个公有的编程范式思维范式应用到其他的任何领域包括生活中?
3 是就有了这篇博文希望大家一起和我探讨一下

2 题描述

给定一个 n 行 m 列的矩阵,矩阵内所有数均为非负整数。需要找到一条最长路径,使得这条路径上的元素是严格递增的。路径可以向上、下、左、右四个方向移动,但不能重复访问同一个单元格。

示例:
输入:[[1,2,3],[4,5,6],[7,8,9]]
输出:5
解释:最长递增路径为 1->2->3->6->9

1暴力 DFS 解法

首先想到的是暴力 DFS,从每个单元格出发,尝试所有可能的路径:
 

#include <stdio.h>
#include <stdlib.h>

// 方向数组:上、下、左、右
const int dirs[4][2] = {
  
  {-1, 0}, {1, 0}, {0, -1}, {0, 1}};

// 深度优先搜索函数
int dfs(int** matrix, int rows, int cols, int r, int c, int prev) {
    // 检查边界条件和递增条件
    if (r < 0 || r >= rows || c < 0 || c >= cols || matrix[r][c] <= prev) {
        return 0;
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值