Programación Dinámica (b) la optimización de la violencia recursiva carretera - el más grande de la trayectoria de triángulo digital y

título Descripción

Escribir imágenes describen aquí

Encontrar un triángulo en las figuras anteriores de la parte superior en el lado final de la ruta, por lo que el camino a través del cual la suma de los números máximos. Cada paso en el camino sólo puede bajar izquierda o bajar de inmediato. Esto sólo requiere un máximo y puede, no se dé una ruta específica.
1 es mayor que el número de líneas del triángulo es igual a menos de 100, un convertidor digital a 0--99

Formatos de entrada:

5      //表示三角形的行数    接下来输入三角形
7
3   8
8   1   0
2   7   4   4
4   5   2   6   5

Requisitos y salida máxima

análisis

Desde el vértice de inicio, y la búsqueda de la mayor parte. Cada punto tiene dos opciones abajo a la izquierda o inferior derecha, inferior izquierda e inferior derecha, que grande, no sé, podemos añadir los dos puntos siguientes visto como el nuevo triángulo, triángulo, respectivamente, obtenidas inferior izquierda e inferior triángulo rectángulo y el camino máximo , sólo tiene que seleccionar el más grande del vértice actual se puede aplicar a. Este es un proceso recursivo.

f(int[] arr,int i,int j){
  return arr[i][j]+max(f(arr,i+1,j),f(arr,i+1,j+1));
}

El pseudo-código no está considerando exportando recursiva, las exportaciones en la última línea, porque esta vez iyj tienen ninguna manera de aumentar, a continuación, el vértice es equivalente a no seguir yendo por la acera, parte omitida después de que el signo puede ser.

Código recursiva

  /**
   * 
   * @param triangle
   *          数字三角形
   * @param i
   *          起点行号
   * @param j
   *          起点列号
   * @return 计算出的最大和
   */
  public static int maxSumUsingRecursive(int[][] triangle, int i, int j) {
    int rowIndex = triangle.length;
    if (i == rowIndex - 1) {
      return triangle[i][j];
    } else {
      return triangle[i][j]
          + Math.max(maxSumUsingRecursive(triangle, i + 1, j),
              maxSumUsingRecursive(triangle, i + 1, j + 1));
    }
  }

En cuanto a este código recursivo, cuando envío a POJ, mostrará los siguientes resultados:

Del código que se ejecuta fuera de tiempo, ¿por qué hacer horas extras? La respuesta es sencilla, porque somos el doble cómputo. Cada uno de los vértices inferior izquierda e inferior derecha dos triángulos imaginarios, dos triángulos se superponen. Cuando llevamos a cabo un recursivo, ayuda a trazar ordenador calcula de la siguiente manera:

Escribir imágenes describen aquí

Optimización 1: recursiva monumento

Tome la tercera fila de números 1, cuando calculamos MaxSum desde la segunda fila de números 23 calcula el MaxSum 1 desde el principio, cuando calculamos MaxSum empezar desde la segunda fila de números 8 calculará el tiempo MaxSum 1 vez desde el principio, de que hay una doble contabilización. Esto perder mucho tiempo. Esto es, si el método de recursión, la profundidad de cada recorrido de ruta, la presencia de un gran número de cálculos repetidos. La complejidad del tiempo es la enésima potencia de 2, para n = 100 filas, sin duda fuera.

A continuación, vamos a considerar cómo mejorar la idea mejorada es: el cambio y pueden representar los parámetros del proceso recursivo recursivas examinados en este ejemplo son dos representantes de los números de fila y columna. Podemos poner los resultados calculados en la posición (i, j) en caché, el siguiente directamente utilizada para su uso.

Hay dos parámetros, la matriz de caché es bidimensional.

De acuerdo con esta idea, podemos poner lo anterior mejoras en el código, por lo que el programa de programación dinámica recursiva de memoria:

  /**
   * 记忆型递归
   * @param triangle
   * @param i
   * @param j
   * @return
   */
  public static int maxSumUsingMemory(int[][] triangle, int i, int j, int[][] map) {
    int rowIndex = triangle.length;
    int value = triangle[i][j];
    if (i == rowIndex - 1) {
    } else {
      //缓存有值,便不递归
      int v1 = map[i + 1][j];
      if (v1 == 0) {
        v1 = maxSumUsingMemory(triangle, i + 1, j,map);
      }
      //缓存有值,便不递归
      int v2 = map[i + 1][j+1];
      if (v2 == 0) {
        v2 = maxSumUsingMemory(triangle, i + 1, j+1,map);
      }
      value = value
          + Math.max(v1, v2);
    }
    //放入缓存
    map[i][j]=value;
    return value;
  }

La complejidad del tiempo es N², la complejidad espacial es N².

reaparición

A continuación, se ve en el mapa de almacenamiento de valores de caché, un valor específico es un valor que se determina por la posición. En este ejemplo derivado i, j máxima requerida para calcular la posición i + 1, j y la posición i + 1, j + 1 posición.

A continuación, la programación dinámica definida con precisión se calcula primero, con el fin de obtener la posición dependiente. Teniendo en cuenta que hasta la última fila de la matriz, podemos empezar a calcular a partir de la última fila, y luego calcular la línea penúltima, y así sucesivamente. Veamos paso a paso para completar este proceso.
En primer lugar, la necesidad de calcular es el último, por lo que puede escribir directamente a la última línea, como se muestra a continuación:

Escribir imágenes describen aquí

Ahora empezar a analizar cada segunda fila de la inversa del número, ahora se puede analizar los números 2,2 y 4 se añaden la última línea, la última línea y se puede resumir 5, está claro que para ser un poco más grande y se añadieron 5, el resultado es 7, esta vez podemos ahorrar hasta 7, 7, 7 a continuación, puede analizar los números y la adición de la última línea 5, y puede ser la última línea de la segunda adición, es evidente que más y 5 se añadió, el resultado es 12, Por lo tanto, vamos a guardarlas 12. Y así sucesivamente. . Podemos obtener la imagen a continuación:

Escribir imágenes describen aquí

Entonces, por el mismo recíproca análisis muestra de la tercera y cuarta de la línea inferior, la primera línea del análisis final, que puede convertir los resultados siguientes:

Escribir imágenes describen aquí

Escribir imágenes describen aquí

Obviamente, podemos utilizar la tabla de programación dinámica de dos dimensiones, pero que no necesitan la ruta exacta del tema, podemos comprimir el espacio, utilizando una matriz unidimensional se puede utilizar en varias ocasiones, ver los códigos específicos:

  public static int maxSumUsingDp(int[][] triangle, int i, int j) {
    int rowCount = triangle.length;
    int columnCount = triangle[rowCount-1].length;
    int[] states = new int[columnCount];
    for (int k = 0; k < columnCount; k++) {
      states[k] = triangle[rowCount-1][k];
    }
    for (int row = rowCount-2; row >= 0; row--) {
      for (int col = 0; col < triangle[row].length; col++) {
        states[col] = triangle[row][col]+Math.max(states[col], states[col+1]);
      }
    }
    return states[0];
  }

resumen

A continuación, tuviéramos que resumir:

Moviendo los métodos de transformación de norma recursivos general:

N tiene un recursivas cambios de parámetros de función, para definir una matriz, el tamaño de la matriz es un rango de valores del parámetro n-dimensional, el valor de índice de matriz representativa de la combinación de parámetros que se llama, el valor del elemento es el valor de este estado.

Si el estado se calcula en repetidas ocasiones, se puede establecer una matriz secundaria para almacenar el valor calculado, cuando el valor de un estado necesita para comprobar la matriz auxiliar, lo que reduce el número de cálculos.

El proceso recursivo inversa, considere la formación de un auxiliar valores de matriz de caché. La recursión es capas dependientes, las reglas de cálculo de primer orden móviles se definen a ser dependiente de los valores calculados. A partir de contorno, llenando gradualmente la matriz.

problema de la mochila es matriz de dos dimensiones, el número de elementos * peso de la mochila

El problema es que la barra de acero 2 matriz unidimensional, el modo de corte de longitud *

El problema es matriz bidimensional de la presente forma de realización, i * j

Estos problemas pueden seguir recursiva - recursividad tipo de memoria - la optimización de la programación dinámica de la carretera.

Publicados 127 artículos originales · ganaron 97 Like · vistas 310 000 +

Supongo que te gusta

Origin blog.csdn.net/zhengwei223/article/details/78762696
Recomendado
Clasificación