当前位置:网站首页>Leetcode-6110: number of incremental paths in the grid graph
Leetcode-6110: number of incremental paths in the grid graph
2022-07-05 06:09:00 【Chrysanthemum headed bat】
leetcode-6110: The number of incremental paths in the grid graph
subject
To give you one m x n
Integer grid graph of grid
, You can move from a grid to 4
Any lattice adjacent in two directions .
Please return to the grid from arbitrarily Grid departure , achieve arbitrarily lattice , And the number in the path is Strictly increasing Number of paths for . Because the answer could be big , Please correct the results 1 0 9 + 7 10^9 + 7 109+7 Remainder After the return .
If the grids accessed in the two paths are not exactly the same , Then they are regarded as two different paths .
Example 1:
Input :grid = [[1,1],[3,4]]
Output :8
explain : Strictly incremental paths include :
- The length is 1 The path of :[1],[1],[3],[4] .
- The length is 2 The path of :[1 -> 3],[1 -> 4],[3 -> 4] .
- The length is 3 The path of :[1 -> 3 -> 4] .
Number of paths is 4 + 3 + 1 = 8 .
Example 2:
Input :grid = [[1],[2]]
Output :3
explain : Strictly incremental paths include :
- The length is 1 The path of :[1],[2] .
- The length is 2 The path of :[1 -> 2] .
Number of paths is 2 + 1 = 3 .
Problem solving
Method 1 :dfs Memory search
adopt memory
Array save , The number of incremental paths per grid
such as memory[i][j]
, Indicates that the end point is (i,j) Number of incremental paths
class Solution {
public:
const int MOD=1e9+7;
vector<vector<int>> dirs={
{
-1,0},{
0,-1},{
1,0},{
0,1}};
vector<vector<int>> memory;
int dfs(vector<vector<int>>& grid,int i,int j){
if(memory[i][j]>0) return memory[i][j];
memory[i][j]=1;
for(vector<int>& dir:dirs){
int nx=i+dir[0];
int ny=j+dir[1];
if(nx<0||nx>=grid.size()||ny<0||ny>=grid[0].size()||grid[i][j]<=grid[nx][ny]) continue;
memory[i][j]=(memory[i][j]+dfs(grid,nx,ny))%MOD;
}
return memory[i][j];
}
int countPaths(vector<vector<int>>& grid) {
int m=grid.size();
int n=grid[0].size();
memory.resize(m,vector<int>(n));
int res=0;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
res=(res+dfs(grid,i,j))%MOD;
}
}
return res;
}
};
Method 2 : Dynamic programming ( Overtime )
dp[i][j][l]
Indicates that the grid point is (i,j)
, The path length is l
The number of ,
The purpose of this is because , Only get a length of l-1
Number of paths for , To calculate the length l Number of paths for .
shortcoming :
However, for example grid[2][3]>grid[2][4]
But every time, we will make repeated comparisons , Traversing (2,3)
, Will compare with the right , Traversing (2,4)
And compare with the left , And can't remember , because dp[i][j][l]
It's just l The result of length , Just an intermediate value , Not the end result .
And method one : It directly saves the number of all incremental paths of each grid point , So it can be memorized .(dfs, Complexity O ( n 2 ) O(n^2) O(n2))
Method 2 can get the number of each path length , A small amount of data can be obtained by , But it will time out .( Matrix traversal , Complexity O ( n 3 ) O(n^3) O(n3))
class Solution {
public:
const int Mod=1e9+7;
vector<vector<int>> dirs={
{
-1,0},{
0,-1},{
1,0},{
0,1}};
int countPaths(vector<vector<int>>& grid) {
int res=0;
int m=grid.size();
int n=grid[0].size();
int maxPath=m*n;
vector<vector<vector<int>>> dp(m,vector<vector<int>>(n,vector<int>(m*n+1)));
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
dp[i][j][0]=0;
dp[i][j][1]=1;
res++;
}
}
for(int l=2;l<=maxPath;l++){
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
dp[i][j][l]=0;
for(vector<int>& dir:dirs){
int nx=i+dir[0];
int ny=j+dir[1];
if(nx>=0&&nx<m&&ny>=0&&ny<n&&grid[i][j]>grid[nx][ny]){
dp[i][j][l]+=dp[nx][ny][l-1];
}
}
res=(res+dp[i][j][l])%Mod;
}
}
}
return res;
}
};
边栏推荐
- 智慧工地“水电能耗在线监测系统”
- Typical use cases for knapsacks, queues, and stacks
- Time of process
- [cloud native] record of feign custom configuration of microservices
- Implement an iterative stack
- [article de jailhouse] jailhouse hypervisor
- 开源存储这么香,为何我们还要坚持自研?
- Appium基础 — 使用Appium的第一个Demo
- API related to TCP connection
- Daily question 2006 Number of pairs whose absolute value of difference is k
猜你喜欢
Personal developed penetration testing tool Satania v1.2 update
R language [import and export of dataset]
Appium foundation - use the first demo of appium
CF1634 F. Fibonacci Additions
Traditional databases are gradually "difficult to adapt", and cloud native databases stand out
SPI details
Appium自动化测试基础 — Appium测试环境搭建总结
Redis publish subscribe command line implementation
2017 USP Try-outs C. Coprimes
Solution to game 10 of the personal field
随机推荐
[article de jailhouse] jailhouse hypervisor
Appium基础 — 使用Appium的第一个Demo
1.15 - 输入输出系统
js快速将json数据转换为url参数
Simply sort out the types of sockets
CCPC Weihai 2021m eight hundred and ten thousand nine hundred and seventy-five
The connection and solution between the shortest Hamilton path and the traveling salesman problem
做 SQL 性能优化真是让人干瞪眼
1039 Course List for Student
[rust notes] 15 string and text (Part 1)
MIT-6874-Deep Learning in the Life Sciences Week 7
Appium自动化测试基础 — Appium测试环境搭建总结
liunx启动redis
Règlement sur la sécurité des réseaux dans les écoles professionnelles secondaires du concours de compétences des écoles professionnelles de la province de Guizhou en 2022
快速使用Amazon MemoryDB并构建你专属的Redis内存数据库
Solution to game 10 of the personal field
SPI details
SQLMAP使用教程(二)实战技巧一
Brief introduction to tcp/ip protocol stack
Overview of variable resistors - structure, operation and different applications