2328. 网格图中递增路径的数目 2001 关于灵神解法的消化
很显然这是一个dp问题,然而dp的状态转移过程如何设置,对于我来说较难观察。题目要求求出从任意格子出发,到任意格子的严格递增路径的数目,根据灵神的题解,状态转移方程如下:
是指从i行,j列出发的严格递增路径条数。
不难发现,,需要用到
这一状态,这样很容易就联想到记忆化递归,而递归的终止条件当然是
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 见祖宗啦;
供交流和记录使用,欢迎批评和指正。