Programación Dinámica - escritura recursiva y recursiva

Programación dinámica

La programación dinámica (Dynamic Programming, DP) es un método utilizado para resolver una clase de problemas de optimización algoritmo pensó.

En resumen, la programación dinámica es un problema complejo en varios sub-problemas, para obtener la solución óptima al problema original a través de una solución subóptima integrado del problema. Programación Dinámica cada solución va a resolver el problema de los niños que se haya registrado, por lo que la próxima vez cuando el niño se encontró con el mismo problema, se puede utilizar un resultado directo de la doble contabilidad previamente grabada, en su lugar.

patrón general se puede utilizar el método recursivo o recurrente para conseguir la programación dinámica, que también se conoce como escritura recursiva de búsqueda de memoria .

Recursiva escrita (de arriba hacia abajo)

Dinámicas de grabación de programación sub-problemas, para evitar la doble contabilidad cuando el próximo encuentro del mismo niño problema.

En las columnas de Fibonacci como un ejemplo, F. 0 = 1, F.. 1. = 2, F. N- = F. N-- 1. + F. N - 2 .

formulación recursiva

int F(int n) {
  if(n == 0 || n == 1) return 1;
  else return F(n-1) + F(n-2);
}

De hecho, esto se repite recursivamente calculados muchas veces, por ejemplo, F (5) = F (4) + F (3), F (4) = F (3) + F (2). Esta vez si no se toman medidas, F (3) será contado dos veces, si n es grande, un gran número de doble recuento,

Para evitar el doble recuento , se puede iniciar un unidimensional array DP [], se han calculado para guardar los resultados, donde dp [n] resultados registrados F (n), y el uso dp [n] = -1 indica No calculado .

int dp[maxn];

int F(int n) {
  if(n == 0 || n == 1) return 1;
  if(dp[n] != -1) return dp[n];
  else {
    dp[n] = F(n-1) + F(n-2);	// 计算 F(n),并且保存在 dp[n] 中
    return dp[n];
  }
}

escrito recursivo (de abajo arriba)

O en el que acabamos de resolver número de Fibonacci, por ejemplo, formulación recursiva debe ser resuelto desde la parte inferior hasta

int dp[maxn];

int F(int n) {
  dp[0] = dp[1] = 1;
  for(int i = 2; i <= n; i++) {
    dp[i] = dp[i-1] + dp[i-2];
  }
  return dp[n];
}

Recursividad está escrito desde el niño empezó a resolver el problema ha sido resuelto hasta que se resuelva el problema que tenemos que resolver.

La idea central

Si la solución óptima a un problema se puede construir de manera efectiva solución sub-óptima a su problema, entonces llamar a este problema tiene subestructura óptima (Optimal Subestructura) . Subestructura óptima garantizar la solución óptima programación dinámica del problema se puede deducir de las llanuras centrales de la solución sub-óptima al problema.

Por lo tanto, una pregunta debe tener subestructura óptima y la superposición de sub-problemas con el fin de utilizar la programación dinámica para resolver.

La diferencia entre estos dos conceptos son:

  • Divide y vencerás y programación dinámica.
    • Partición y DP se dividen en sub-problemas a resolver, pero la partición del problema de la descomposición es que no se solapan, programación dinámica para resolver el problema, pero han superposición de sub-problemas. Y divide y vencerás para resolver el problema no es necesariamente el problema de optimización, y el problema debe ser resuelto por el problema de optimización de programación dinámica
  • Greedy de programación y dinámico
    • Greedy de programación y dinámica debe tener subestructura óptima. El cálculo de la diferencia entre los dos es que el método de cálculo utilizado es similar al de arriba hacia abajo codicioso, pero no esperar a que la resolución de problemas del niño se ha completado y luego elegir uno, eligiendo en lugar de emitir un niño directamente a través de una estrategia para resolver no sea seleccione la pregunta directamente abandonado. Puede que no seamos capaces de obtener la solución óptima. La programación dinámica siempre en cuenta todos los sub-problemas, y una mejor selección de sub-problemas como resultado, por el momento, sub-problemas no se heredan, debido a la superposición de sub-problemas, van a elegir este último también puede ser más largo, por lo que existe la oportunidad de convertirse en un mundial la mejor parte, no es necesario renunciar.

Supongo que te gusta

Origin www.cnblogs.com/veeupup/p/12546346.html
Recomendado
Clasificación