[Grupo C++A/C de la 7.ª Competición Provincial de la Copa Lanqiao] [Intervalo DP] Contraseña perdida

caída de contraseña

Los arqueólogos del Planeta X descubrieron un lote de códigos que quedaron de la antigüedad.

Estos códigos son secuencias unidas por las semillas de las plantas A, B, C y D.

Después de un análisis cuidadoso, se encuentra que estas cadenas de contraseña deben ser simétricas de adelante hacia atrás (es decir, lo que llamamos cadenas espejo).

Debido a la edad, muchas de estas semillas se han caído y, por lo tanto, pueden perder sus características de imagen especular.

Tu tarea es:

Dada una cadena de contraseña que ve ahora, calcule cuántas semillas necesita arrojar al menos desde el estado original, antes de que pueda convertirse en lo que es ahora.

Formato de entrada
Un total de una línea, incluida una cadena de caracteres compuesta por letras mayúsculas ABCD, que indica la cadena de contraseña que ve ahora.

Formato de salida
Muestra un número entero que indica al menos cuántas semillas se arrojaron.

Rango de datos
La longitud de la cadena de entrada no excede 1000

Ejemplo de entrada 1:

ABCBA

Ejemplo de salida 1:

0

Ejemplo de entrada 2:

ABDCDCBABC

Ejemplo de salida 2:

3

Análisis de ideas:
res = Agregue algunos caracteres para convertirse en un palíndromo <-equivalente a-> elimine algunos caracteres para convertirse en un palíndromo <-equivalente a-> longitud total: la longitud de la subsecuencia de palíndromo más larga

状态表示:
f[l][r] 表示所有s[l ~ r] 之间的回文子序列的集合的长度最大值
划分:
1. l和r都不在  f[l + 1][r - 1]
2. l在r不在    f[l][r - 1]
3. l不在r在    f[l + 1][r]
4. l和r都在    f[l + 1][r - 1] + 2
状态转移方程:
f[l][r] = max(f[l][r - 1], f[l + 1][r])
f[l][r] = max(f[l][r], f[l + 1][r - 1] + 2)
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
const int N = 1010;
char s[N];
int f[N][N];

int main()
{
    
    
    scanf("%s", s);
    int n = strlen(s);
    
    for (int len = 1; len <= n; len ++)
        for (int l = 0; l + len - 1 < n; l ++)
        {
    
    
            int r = l + len - 1;
            if (len == 1) f[l][r] = 1;
            else
            {
    
    
                f[l][r] = max(f[l][r - 1], f[l + 1][r]);
                if (s[l] == s[r]) f[l][r] = max(f[l][r], f[l + 1][r - 1] + 2);
            }
        }
    cout << n - f[0][n - 1] << endl;
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/laaa123mmm/article/details/128990235
Recomendado
Clasificación