Se puede resolver en o (n * k * k) programación dinámica.
Considere el algoritmo o (n * n) dado en la descripción.
¿Realmente necesitamos endPointer?
podemos calcular endPointer si conocemos startPointer, número de letras omitidas antes de startPointer y número de letras patrón después de startPointer.
DP [startPtr] [leftRemoved] [rightRemoved] representa el estado con startPointer en startPtr, después de omitir los caracteres leftRemoved a la izquierda de startPointer y rightRemoved chars a la derecha o startPointer.
- ¿Cuál sería su selección de 20 problemas en algoritmos de clasificación (6 problemas de nivel básico, 6 problemas de nivel medio y 8 difíciles) para que resolver esos 20 le daría la máxima comprensión sobre la clasificación?
- ¿Cómo funciona el algoritmo de adsorción?
- No puedo entender algoritmos y estructuras de datos. ¿Cómo puedo aprender algoritmos y estructuras de datos de una manera simple?
- ¿Cómo podemos demostrar que cada matriz 1D tiene un pico o que cualquier matriz 1D siempre tiene un pico?
- ¿Es el algoritmo y la metodología para corregir automáticamente las palabras mal escritas en las consultas de búsqueda de Google una "salsa secreta" o está abierto?
DP [0] [0] [0] es el caso base.
Lea los comentarios en el código para más detalles.
cuerda s; // Cadena de entrada int k; // Entrada k char dp [21000] [31] [31]; // Establecer a -1 inicialmente char solve (int startPointer, int leftRemoved, int rightRemoved) { int endPointer = s.ln - rightRemoved - (startPointer - leftRemoved) - 1; if (startPointer> = endPointer) devuelve verdadero; //Caso base char & ret = dp [puntero de inicio] [leftRemoved] [rightRemoved]; if (ret! = -1) devuelve ret; ret = falso; // Caso donde los extremos son iguales if (s [startPointer] == s [endPointer]) ret = solve (startPointer + 1, leftRemoved, rightRemoved); // Comprueba si puedes eliminar un elemento más. // En caso afirmativo, verifique después de quitar de adelante y atrás if (leftRemoved + rightRemoved <k) { ret | = resolver (startPointer + 1, leftRemoved + 1, rightRemoved) || resolver (startPointer, leftRemoved, rightRemoved + 1); } volver ret; }