2328. 网格图中递增路径的数目 2001 关于灵神解法的消化

很显然这是一个dp问题,然而dp的状态转移过程如何设置,对于我来说较难观察。题目要求求出从任意格子出发,到任意格子的严格递增路径的数目,根据灵神的题解,状态转移方程如下:

f_{i,j} = \sum(f_{i+1,j}+f_{i,j+1}+f_{i-1,j}+f_{i,j-1})\\ ans = \sum(f_{i,j})

f_{i,j}是指从i行,j列出发的严格递增路径条数。

不难发现,f_{i,j}\,f_{i+2,j}\,f_{i,j-1}\,f_{i,j + 1},需要用到f_{i+1,j}这一状态,这样很容易就联想到记忆化递归,而递归的终止条件当然是f_{i,j} = 1

c++代码如下(复制的灵神

class Solution {
public:
    const int MOD = 1'000'000'007;
    const int dirs[4][2] = {{-1,0},{1,0},{0,-1},{0,1}};
    int countPaths(vector<vector<int>>& grid) {
        int m = grid.size(),n = grid[0].size();
        vector memo(m,vector<int>(n,-1));
        auto dfs = [&](this auto&& dfs,int i ,int j) -> int{
            //  auto dfs = [&](this auto&& dfs, int i, int j) -> int {
            int& res  =  memo[i][j];
            if (res != -1){
                return res;
            }
            res = 1;
            for (auto& [dx,dy]:dirs){
                int x = i + dx;
                int y = j + dy;
                if(0 <= x&& x < m&&0 <= y && y < n&& grid[x][y] > grid[i][j]){
                    res = (res + dfs(x,y))%MOD;
                }
            }
            return res;
        };
        long long ans = 0;
        for (int i= 0;i < m  ; i ++){
            for (int j = 0; j < n; j ++){
                ans += dfs(i,j);
            }
        }
        return ans%MOD;
        
    }
};

因为我写cpp还是不太熟练,所以顺便学习学习cpp函数调用的语法。

        auto dfs = [&](this auto&& dfs,int i ,int j) -> int{}

这是一行lambda表达式,auto说明能自动识别这个函数返回的任意值,[&]表示捕获外部的所有变量,this表示调用自身,在cpp20后才有这个功能,其他就是正常的函数调用了。

而对于在计算过程种不变的量,可以设置为常量

    const int MOD = 1'000'000'007;
    const int dirs[4][2] = {{-1,0},{1,0},{0,-1},{0,1}};

值得一提的是,cpp的数组全部用花括号表示。而且常量数组一般不能使用vector,因为vector的大小在程序运行时才可以确定,不符合常量不可变性质。

关于ans开的Long long 自然是不开long long 见祖宗啦;

供交流和记录使用,欢迎批评和指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值