[Pregunta] 329. La ruta incremental más larga en la matriz-Dada una matriz de matriz entera mxn, averigüe la longitud de la ruta incremental más larga. Para cada celda, puede moverse hacia arriba, abajo, izquierda y derecha.

Asunto: 329. La ruta incremental más larga de la matriz

Dada una matriz de matriz entera de mxn, calcule la longitud de la ruta incremental más larga.

Para cada celda, puede moverse hacia arriba, abajo, izquierda y derecha. No puede moverse en la dirección diagonal o moverse fuera del límite (es decir, no se permite la órbita).

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

responder:

Piense en la matriz como un gráfico dirigido, y cada celda corresponde a un nodo en el gráfico. Si los valores de dos celdas adyacentes no son iguales, hay un valor más pequeño entre las dos celdas adyacentes Un borde dirigido que apunta a un mayor valor. El problema se transforma en encontrar el camino más largo en un gráfico dirigido.

La búsqueda en profundidad es un método muy intuitivo. Realice una búsqueda en profundidad a partir de una celda para encontrar la ruta creciente más larga desde esa celda. Después de realizar la búsqueda en profundidad en cada celda por separado, se puede obtener la longitud de la ruta incremental más larga en la matriz.

Pero si usa la búsqueda ingenua en profundidad, la complejidad del tiempo es exponencial y excederá el límite de tiempo, por lo que debe optimizarse.

La razón de la alta complejidad temporal de la búsqueda ingenua en profundidad es que se realiza una gran cantidad de cálculos repetidos. La misma celda se visitará varias veces y el cálculo debe recalcularse cada vez que se visita. Dado que la longitud de la ruta incremental más larga correspondiente a la misma celda es fija, se puede optimizar mediante la memorización. El memo de matriz se utiliza como matriz de caché y los resultados de las celdas que se han calculado se almacenan en la matriz de caché.

Usando la búsqueda en profundidad memorizada, cuando se accede a una celda (i, j) (i, j), si memo [i] [j]! = 0, significa que el resultado de la celda ha sido calculado, luego directamente desde Lea el resultado en la caché. Si memo [i] [j] == 0, significa que el resultado de la celda no se ha calculado, luego busque y almacene el resultado calculado en la caché.

Después de atravesar todas las celdas de la matriz, se puede obtener la longitud de la ruta incremental más larga de la matriz.

// 矩阵数据的上、下、左、右四个移动
// 矩阵数据要一组一组的看
const int dirs[4][2] = {
    
    {
    
    -1, 0}, {
    
    1, 0}, {
    
    0, -1}, {
    
    0, 1}};
// 全局变量
int rows, columns;

// 找出 最长递增路径 的长度
int longestIncreasingPath(int** matrix, int matrixSize, int* matrixColSize)
{
    
    
	// 矩阵为空
    if (matrixSize == 0 || matrixColSize[0] == 0)
        return 0;
    rows = matrixSize;
    columns = matrixColSize[0];
    int** memo = (int**)malloc(sizeof(int*) * rows);
    for (int i = 0; i < rows; i++)
    {
    
    
        memo[i] = (int*)malloc(sizeof(int) * columns);
        memset(memo[i], 0, sizeof(int) * columns);
    }
    int ans = 0;
    for (int i = 0; i < rows; i++)
    {
    
    
        for (int j = 0; j < columns; j++)
        {
    
    
            ans = fmax(ans, dfs(matrix, i, j, memo));
        }
    }
    free(memo);
    return ans;
}

// 深度优先搜索
int dfs(int** matrix, int row, int column, int** memo)
{
    
    
    if (memo[row][column] != 0)
        return memo[row][column];
    // 长度+1
    memo[row][column]++;
    for (int i = 0; i < 4; i++)
    {
    
    
        // const int dirs[4][2] = {
    
    {-1, 0}, {1, 0}, {0, -1}, {0, 1}};
        int newRow = row + dirs[i][0], newColumn = column + dirs[i][1];
        if (newRow >= 0 && newRow < rows && newColumn >= 0 && newColumn < columns && matrix[newRow][newColumn] > matrix[row][column])
            memo[row][column] = fmax(memo[row][column], dfs(matrix, newRow, newColumn, memo) + 1);
    }
    return memo[row][column];
}

Supongo que te gusta

Origin blog.csdn.net/m0_46613023/article/details/114045160
Recomendado
Clasificación