美文网首页
LeetCode #329 Longest Increasing

LeetCode #329 Longest Increasing

作者: 刘煌旭 | 来源:发表于2021-04-18 00:33 被阅读0次
    Longest_Increasing.png
    /**
    * DFS along will not do; it has to be seasoned with some pruning...
    */
    int dfs(int **matrix, int m, int n, bool **flags, int i, int j, int **max) {
        int up = 0, right = 0, down = 0, left = 0, len = 0;
        if (i - 1 >= 0 && !flags[i - 1][j] && matrix[i - 1][j] > matrix[i][j] && max[i - 1][j] < max[i][j] + 1) {
            max[i - 1][j] = max[i][j] + 1;
            flags[i - 1][j] = true;
            up = 1 + dfs(matrix, m, n, flags, i - 1, j, max);
            flags[i - 1][j] = false;
        }
        if (len < up) { len = up; }
    
        if (j + 1 < n && !flags[i][j + 1] && matrix[i][j + 1] > matrix[i][j] && max[i][j + 1] < max[i][j] + 1) {
            if (max[i][j + 1] < max[i][j] + 1) { max[i][j + 1] = max[i][j] + 1; }
            flags[i][j + 1] = true;
            right = 1 + dfs(matrix, m, n, flags, i, j + 1, max);
            flags[i][j + 1] = false;
        }
        if (len < right) { len = right; }
    
        if (i + 1 < m && !flags[i + 1][j] && matrix[i + 1][j] > matrix[i][j] && max[i + 1][j] < max[i][j] + 1) {
            if (max[i + 1][j] < max[i][j] + 1) { max[i + 1][j] = max[i][j] + 1; }
            flags[i + 1][j] = true;
            down = 1 + dfs(matrix, m, n, flags, i + 1, j, max);
            flags[i + 1][j] = false;
        }
        if (len < down) { len = down; }
    
        if (j - 1 >= 0 && !flags[i][j - 1] && matrix[i][j - 1] > matrix[i][j] && max[i][j - 1] < max[i][j] + 1) {
            if (max[i][j - 1] < max[i][j] + 1) { max[i][j - 1] = max[i][j] + 1; }
            flags[i][j - 1] = true;
            left = 1 + dfs(matrix, m, n, flags, i, j - 1, max);
            flags[i][j - 1] = false;
        }
        if (len < left) { len = left; }
    
        return len;
    }
    
    int longestIncreasingPath(int** matrix, int matrixSize, int* matrixColSize) {
        bool **flags = (bool**)malloc(matrixSize * sizeof(*flags));
        int **max = (int**)malloc(matrixSize * sizeof(*max));
        for (int i = 0; i < matrixSize; i++) {
            flags[i] = (bool*)malloc(*matrixColSize * sizeof(bool));
            max[i] = (int*)malloc(*matrixColSize * sizeof(int));
            for (int j = 0; j < *matrixColSize; j++) { 
                flags[i][j] = false; 
                max[i][j] = INT_MIN;
            }
        }
    
        int len = 0;
        for (int i = 0; i < matrixSize; i++) {
            for (int j = 0; j < *matrixColSize; j++) {
                if (max[i][j] < 1) {
                    max[i][j] = 1; 
                    flags[i][j] = true;
                    int tlen = dfs(matrix, matrixSize, *matrixColSize, flags, i, j, max);
                    flags[i][j] = false;
                    if (len < tlen) { len = tlen; }
                }
            }
        }
        return len + 1;
    }
    

    相关文章

      网友评论

          本文标题:LeetCode #329 Longest Increasing

          本文链接:https://www.haomeiwen.com/subject/jnwplltx.html