BM61 矩阵最长递增路径(描述给定一个 n 行 m 列矩阵 matrix ,矩阵内所有数均为非负整数。 你需要在矩阵中找到一条最长路径,使这条路径上的元素是递增的。并输出这条最长路径的长度。

/*
描述
给定一个 n 行 m 列矩阵 matrix ,矩阵内所有数均为非负整数。 你需要在矩阵中找到一条最长路径,使这条路径上的元素是递增的。并输出这条最长路径的长度。
这个路径必须满足以下条件:

1. 对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外。
2. 你不能走重复的单元格。即每个格子最多只能走一次。
带备忘录的递归,
*/

int dfs(vector<vector<int> > &matrix,int x,int y,int last_num,vector<vector<int> > &dp)
    {
        if(last_num >= matrix[x][y])
            return 0;
        if(dp[x][y] != -1)
            return dp[x][y];
        int num = 0;
        if(x + 1 < matrix.size())
            num = max(num,dfs(matrix,x + 1,y,matrix[x][y],dp));
        
        if(x - 1 >= 0)
            num = max(num,dfs(matrix,x - 1,y,matrix[x][y],dp));
        
        if(y - 1 >= 0)
            num = max(num,dfs(matrix,x,y - 1,matrix[x][y],dp));
        
        if(y + 1 < matrix[0].size())
            num = max(num,dfs(matrix,x,y + 1,matrix[x][y],dp));
        dp[x][y] = num + 1;
        return num + 1;
    }
    int solve(vector<vector<int> >& matrix) {
        // write code here
        int n=matrix.size();
        int m=matrix[0].size();
        // 特判矩阵为空的情况
        if(n==0){
            return 0;
        }
        vector<vector<int> > dp(n,vector<int>(m,-1));
        int ans=0;
//        int m=matrix[0].size();
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                // 枚举每个起点的位置
                ans=max(ans,dfs(matrix,i,j,-1,dp));
            }
        }
         
        return ans;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值