Serie DP Guía de introducción -DP

DP Primeros pasos

En reciente dp entrada, por supuesto, no voy a DP. Pero yo he puesto con fuerza hacia abajo, entonces no puedo aprender DP I dejar de laboratorio. . .
En primer lugar explicar el concepto de la DP más entrada:
con mi maestro me enseñó las palabras, lo que DP es, el núcleo es evitar la doble contabilidad. Para las castañas bar.
Si desea contar serie de Fibonacci, entonces la cantidad de arrendamiento es muy simple, pero si el valor de conteo es demasiado grande, por ejemplo, lo primero que cuente hasta 50, entonces, ¿cómo debería contarlo? ? ? Aceptar que debemos seguir primero las ideas normales para escribir sobre número normal de Fibonacci.

#include<stdio.h>
typedef long long ll;
ll F(int a)
{if(a==1||a==2)
return 1;
return F(a-1)+F(a-2);
}
int main()
{
 int num;
 scanf("%d",&num);
 printf("%lld\n",F(num));
 return 0;
 } 

OK, creo que esto debería ser un número de Fibonacci un muy buen entendimiento, a continuación, ponemos a prueba el rendimiento del programa.
Aquí Insertar imagen Descripción
Bueno, podemos ver, corrió 50 pasado casi un minuto, entonces usted está en esta evaluación de programas es, sin duda a ir mal en el servidor ah. Así que esto es un gran error. Analizar las razones. ¿Por qué sucede esto.

Podemos pensar en cada computing no está todo basado en el punto anterior y su primer dos. Este es el caso antes de que usted no es el que tienen que confiar en su parte delantera y dos artículos anteriores. Pero los resultados no pueden ser contados a otro uso? Por ejemplo, desea contar F (5), entonces usted tiene que calcular F (4) y F (3) y F (4) se calcula de nuevo F (3) y F (2)) lógico pensar que usted ha puesto F (3) recuento , sin embargo, F (3) se lleva a cabo una vez más que la operación no tiene sentido. Así que esta doble contabilidad. Entonces, ¿cómo resolver este problema mediante la DP es? ?

Aquí Insertar imagen Descripción
Obviamente los resultados, incluyendo el tiempo de entrada, incluyendo una parte de menos de un segundo.
El siguiente código mejorado DP

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll dp[5000];
ll F(int a) {
 if(dp[a]!=-1)
  return dp[a];
 ll temp=F(a-1)+F(a-2);
 dp[a]=temp;
 return temp;
}
int main() {
 memset(dp,-1,sizeof(dp));
 dp[1]=dp[2]=1;
 int num;
 cin>>num;
 cout<<F(num)<<endl;
 return 0;
}

Si lo hace, columnas entonces cada número de Fibonacci hemos calculados se almacenan un poco, por lo que necesitamos tiempo se puede llamar directamente, sólo fuimos a esos cálculos repetitivos tediosas.

Así que lo más importante es la transición de estado DP, en otras palabras, cuando se puede llamar que no va pregunta a la vez. Por ejemplo, supongamos que cuentes 1 + 1 + 1 + 1 + 1 igual a unos pocos. Obviamente la respuesta igual a 5, de manera que si se cuenta el 1 + 1 + 1 + 1 + 1 + 1 es? Elige registrar seis o transferido desde dicha seleccionado sobre la base de cinco veces antes de dirigir las operaciones del estado? Ciertamente, este último, entonces la respuesta directamente de 5 + 1 = 6.

Tal DP Prólogo finalmente arrancó! ! !
Subproducto de la rueda mes

Publicado 32 artículos originales · ganado elogios 12 · vistas 1196

Supongo que te gusta

Origin blog.csdn.net/qq_35339563/article/details/103579887
Recomendado
Clasificación