Programación dinámica para resolver el problema de la serie máxima de productos (enumeración violenta rodante) java

contenido

1. Ejemplos

Tema Descripción

2. Análisis del pensamiento

idea básica

Pasos específicos

3. Implementación del código

4. Resumen de DP

darse cuenta


1. Ejemplos

Tema Descripción

Dada una subcadena S de n elementos, debe encontrar una subcadena consecutiva con el producto más grande.

Si este producto mayor no es positivo, debería dar como resultado 0 (lo que indica que no hay solución).

ingresar

La primera línea es un número entero n (1<=n<=18).

La segunda línea es n enteros. donde cada entero está en el rango [-10,10].

producción 

Muestra una línea que contiene un número entero, genera el producto más grande.

Datos de prueba 

Ver código.

2. Análisis del pensamiento

idea básica

El tema es similar al problema de la mochila, y su idea básica puede ser la programación dinámica: recordar las soluciones a los subproblemas que se han resuelto. Resolver, es decir, al recorrer los datos, se registra el producto máximo obtenido durante el proceso de recorrido, y luego se continúa el recorrido. A través de cada recorrido, se actualiza dinámicamente el producto máximo y finalmente se obtiene la solución final.

Para tales preguntas, se pueden definir dos variables, max y min, para registrar los valores máximo y mínimo en el proceso. cur representa los datos actuales que se calcularán en el proceso de cálculo. En cada proceso de cálculo, max toma el valor máximo de Max.( cur, cur*max, cur*min ), y min toma el valor mínimo de Min.( cur, cur*max, cur*min ).

Pasos específicos

1) Inicialice los datos cur, max, min, el valor predeterminado es el primer número.

2) Recorra los elementos de la matriz.

3) Cada vez que el bucle max, min se multiplican por el elemento actual cur. y guardarlo con una variable temporal.

4) Calcular el nuevo máximo y mínimo y reasignarlos.

5) El nuevo valor máximo ans=Max(max, ans) en el proceso de cálculo.

6) Después de atravesar, imprima ans.

3. Implementación del código


import java.util.Scanner;

public class Main {
	static long[] nums;// 用来存放数据

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int m = scanner.nextInt();
		/**
		 * long cur 当前数据 long max 最大数 long min 最小数 long ans 最终结果
		 */
		long cur, max, min, ans = 0;
		// 录入数据
		for (int i = 0; i < m; i++)
			nums[i] = scanner.nextLong();
		// 初始化数据,默认都为第一个数
		cur = nums[0];
		max = nums[0];
		min = nums[0];
		for (int i = 1; i < m; i++) {
			cur = nums[i];// 当前处理的数
			long tempmax = max * cur;// 当前数cur乘以最大数max,定义一个临时变量tempmax储存
			long tempmin = min * cur;// 当前数cur乘以最小数min,定义一个临时变量tempmin储存
			// 新的max在上面三个数中产生
			/* 因为max在下一步求min时还要用到,因此这里定义一个临时变量储存newmax */
			long newmax = Math.max(cur, Math.max(tempmax, tempmin));
			min = Math.min(cur, Math.min(tempmax, tempmin));
			max = newmax;// max使用完后,将新的newmax赋值给max
			ans = Math.max(ans, max);// 数据处理过程中的答案在ans和max中产生
		}
		System.out.println(ans);
	}

}

4. Resumen de DP

darse cuenta

La idea central del algoritmo de programación dinámica (Programación Dinámica) es dividir el gran problema en pequeños problemas para resolver, a fin de obtener la solución óptima paso a paso. El
algoritmo de programación dinámica es similar al algoritmo divide y vencerás, y su idea básica es descomponer el problema a resolver en varios subproblemas, primero resolver los subproblemas y luego obtener la solución del problema original a partir de las soluciones de estos subproblemas.
A diferencia del método divide y vencerás, los subproblemas obtenidos por descomposición a menudo no son independientes entre sí para problemas que son adecuados para resolver mediante programación dinámica. (Es decir, la solución de la siguiente subetapa se basa en la solución de la subetapa anterior y se llevan a cabo más soluciones).
La programación dinámica se puede avanzar gradualmente completando el formulario para obtener la solución óptima.

Supongo que te gusta

Origin blog.csdn.net/qq_52360069/article/details/123533029
Recomendado
Clasificación