矩阵中的最长递增路径

﹏ヽ暗。殇╰゛Y 2024-03-31 10:29 163阅读 0赞

力扣题目

  1. 矩阵中的最长递增路径

题目描述:

56c6547292da4f38bfb81f161ec24c9e.png

解题思路:

看到这题,往上,下,左,右四个方向移动单元格,我的第一反应是运用深度优先搜索,但是单单使用到深度优先搜索的结果会超出时间限制,时间复杂度过高,进行了大量的重复运算,所以这道题还需要运用动态规划来进行优化,存储以前面单元格为起点的最长递增路径的长度,减少重复的计算。

先设置数组dp[i][j]表示以单元格(i,j)为起点的最长递增路径的长度,遍历每个单元格,然后对于每个单元格,可以往上,下,左,右四个方向移动,通过设置数组来实现单元格上下左右移动时i和j的变化,我们可以对每个单元格进行深度优先搜索,当相邻的单元格b大于当前单元格时a,我们可以移动到这个相邻的单元格b。继续进行深度优先搜索,如果数组dp[i][j]不为0,那么说明当前单元格b已经被计算过,因为以单元格b为起点的递增路径,也为单元格a的递增路径的一部分,所以我们可以直接使用这个计算结果,算出单元格a的递增路径的长度,然后用fmax函数经过比较来得出最长递增路径。遍历完矩阵中的所有单元格之后,即可得到矩阵中的最长递增路径的长度。

提交的代码:

  1. int a[4][2]={
  2. {-1,0},{1,0},{0,1},{0,-1}};
  3. int dfs(int **matrix,int m,int n,int x,int y,int**dp){
  4. if(dp[x][y]!=0){
  5. return dp[x][y];
  6. }
  7. dp[x][y]++;
  8. for(int k=0;k<4;k++){
  9. int xx=x+a[k][0];
  10. int yy=y+a[k][1];
  11. if(xx>=0&&xx<m&&yy>=0&&yy<n&&matrix[x][y]<matrix[xx][yy]){
  12. dp[x][y]=fmax(dp[x][y],dfs(matrix,m,n,xx,yy,dp)+1);
  13. }
  14. }
  15. return dp[x][y];
  16. }
  17. int longestIncreasingPath(int** matrix, int matrixSize, int* matrixColSize){
  18. if(matrix==NULL)
  19. return 0;
  20. int m=matrixSize,n=matrixColSize[0],i=0,j=0;
  21. int** dp = (int**)malloc(sizeof(int*) * m);
  22. for (int i = 0; i < m; i++) {
  23. dp[i] = (int*)malloc(sizeof(int) * n);
  24. memset(dp[i], 0, sizeof(int) * n);
  25. }
  26. int ans=0;
  27. for(i=0;i<m;i++){
  28. for(j=0;j<n;j++){
  29. ans=fmax(ans,dfs(matrix,m,n,i,j,dp));
  30. }
  31. }
  32. return ans;
  33. }

发表评论

表情:
评论列表 (有 0 条评论,163人围观)

还没有评论,来说两句吧...

相关阅读

    相关 329. 矩阵递增路径

    给定一个整数矩阵,找出最长递增路径的长度。 对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外(即不允许环绕)。 ![在这里插入