Recorrido recursivo y recorrido de bucle for: implementación de recorrido recursivo, fácil de entender

1. La fuente de la idea: Botón de encendido pregunta 14- I. Corte la cuerda
para obtener una cuerda de longitud n, corte la cuerda en m segmentos de longitud entera (myn son números enteros, n> 1 ym> 1) , La longitud de cada cuerda se registra como k[0],k[1]...k[m-1]. ¿El k[0] x k[1] x ... x k[m-1]producto máximo posible es cuánto? Por ejemplo, cuando la longitud de la cuerda es 8, la cortamos en tres trozos con longitudes de 2, 3 y 3. El producto máximo obtenido en este momento es 18.

示例 1:
输入: 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1

示例 2:
输入: 10
输出: 36
解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36

2. Pensamiento:
generalmente pensamos en una solución de programación dinámica cuando hacemos demasiadas preguntas, expandimos la longitud de la cuerda de abajo hacia arriba y completamos la solución del problema. Pero los principiantes solo pueden pensar enBúsqueda de fuerza bruta, atravesar todos los métodos de corte de cuerda, comparar y obtener resultados
Para el recorrido, generalmente pensamos en el recorrido del bucle for, pero para este problema, es difícil pensar en lo que representa cada bucle for y cuál es su rango, por lo que la solución del bucle for falla. Sin embargo, el método de recorrido recursivo es más sencillo de implementar y comprender, por lo que debe recordar que se usa con más frecuencia al resolver problemas .
Ideas Fuente: Autor: z1m, Fuente: fuerza de hebilla
método: violencia transversal recursiva
que tendemos a formar en la mente de una solución intuitiva muy violenta que consiste en enumerar todos los casos, encontrar el producto del máximo de la solución.
Establezca F (n) de longitud n, se puede obtener el producto máximo de la cuerda, para cada F (n), se puede obtener por descomposición:
Inserte la descripción de la imagen aquí
ver que podemos resolver la figura del F(n)problema en resolver F(n-1)los problemas, y así sucesivamente hasta resolver hasta F(2)cuando F(2) = 1, de regreso recursivo, se ha resuelto el problema.Esta es la idea de dividir y conquistar.
La solución a la idea de dividir y conquistar es a menudo la recursividad.Tenga en cuenta que cada vez que cortamos un trozo de cuerda en dos pedazos, la parte restante se puede cortar o no, por lo que obtenemos una función recursiva F(n)=max(i*(n-i),i*F(n-i)), i=1,2,...,n-2.
Código:

class Solution {
    
    
public:
    int cuttingRope(int n) {
    
    
    	if(n == 2) return 1;
    	int res = -1;
    	for(int i = 1;i<n;i++){
    
    
			res = max(res, max(i * cuttingRope(n-i),i*(n-1)) );
		}
		return res;
    }
};

Método 2: Tecnología de memorización (de arriba hacia abajo) Las
soluciones violentas mencionadas anteriormente expirarán , pero muchas soluciones avanzadas suelen ser optimizaciones de soluciones violentas. Tenga en cuenta que el motivo del tiempo de espera en el código anterior se debe principalmente al cálculo repetido de F (n). Para evitar cálculos repetidos, se puede utilizar la memorización.
El código de la tecnología mnemotécnica usa la matriz f para almacenar la longitud máxima f [i] cuando la longitud es i, y finalmente devuelve f [n].
Código:

class Solution {
    
    
public:
    int cuttingRope(int n) {
    
    
    	if(n == 2) return 1;
    	if (f[n] != 0) // 如果f[n]已经计算过,直接返回避免重复计算
            return f[n];
    	int res = -1;
    	for(int i = 1;i<n;i++){
    
    
			res = max(res, max(i * cuttingRope(n-i),i*(n-1)) );
		}
		f[n] = res;
		return res;
    }
};

La búsqueda con notas también se denomina "método de notas"., Comienza desde F (n) en la estructura de árbol similar a la anterior, y gradualmente regresa al valor conocido F (2).La comprensión se convierte en una solución complementaria

Solución de programación dinámica Ver blog original: Autor: z1m, fuente: botón de encendido

para resumir:

1. El recorrido recursivo es simple de implementar y comprender, y es más fácil de usar que el bucle for, pero la complejidad del tiempo es ligeramente mayor (la parte del coeficiente constante es grande).
2. Para el recorrido recursivo, la solución del subproblema generalmente se calcula repetidamente, por lo que el método de memoria se usa a menudo para guardar la solución del subproblema.

Supongo que te gusta

Origin blog.csdn.net/qq_33726635/article/details/106616700
Recomendado
Clasificación