contenido
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.