当前位置:网站首页>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;
}
};
边栏推荐
- wordpress切换页面,域名变回了IP地址
- Data visualization chart summary (I)
- Wazuh开源主机安全解决方案的简介与使用体验
- Smart construction site "hydropower energy consumption online monitoring system"
- Full Permutation Code (recursive writing)
- 1039 Course List for Student
- SQLMAP使用教程(二)实战技巧一
- The sum of the unique elements of the daily question
- Individual game 12
- 网络工程师考核的一些常见的问题:WLAN、BGP、交换机
猜你喜欢
leetcode-6110:网格图中递增路径的数目
从Dijkstra的图灵奖演讲论科技创业者特点
Traditional databases are gradually "difficult to adapt", and cloud native databases stand out
[practical skills] technical management of managers with non-technical background
【实战技能】如何做好技术培训?
Real time clock (RTC)
Fried chicken nuggets and fifa22
【云原生】微服务之Feign自定义配置的记录
RGB LED infinite mirror controlled by Arduino
LaMDA 不可能觉醒吗?
随机推荐
leetcode-556:下一个更大元素 III
【Rust 笔记】17-并发(上)
【实战技能】如何做好技术培训?
2020ccpc Qinhuangdao J - Kingdom's power
[rust notes] 14 set (Part 1)
One question per day 2047 Number of valid words in the sentence
[practical skills] technical management of managers with non-technical background
LeetCode 0107.二叉树的层序遍历II - 另一种方法
Introduction to convolutional neural network
数据可视化图表总结(二)
Sqlmap tutorial (1)
Simply sort out the types of sockets
1041 Be Unique
leetcode-6111:螺旋矩阵 IV
Navicat連接Oracle數據庫報錯ORA-28547或ORA-03135
[rust notes] 13 iterator (Part 2)
[rust notes] 16 input and output (Part 2)
Appium foundation - use the first demo of appium
做 SQL 性能优化真是让人干瞪眼
[jailhouse article] look mum, no VM exits