HDU 1159. Solución súper detallada de subsecuencia común (subsecuencia común más larga de DP)

1. Título

Una subsecuencia de una secuencia dada es la secuencia dada con algunos elementos (posiblemente ninguno) omitidos. Dada una secuencia X = <x1, x2, ..., xm> otra secuencia Z = <z1, z2, ..., zk> es una subsecuencia de X si existe una secuencia estrictamente creciente <i1, i2, ..., ik> de índices de X tal que para todos j = 1,2, ..., k, xij = zj. Por ejemplo, Z = <a, b, f, c> es una subsecuencia de X = <a, b, c, f, b, c> con secuencia de índice <1, 2, 4, 6>. Dadas dos secuencias X e Y, el problema es encontrar la longitud de la subsecuencia común de longitud máxima de X e Y.
La entrada del programa es de un archivo de texto. Cada conjunto de datos en el archivo contiene dos cadenas que representan las secuencias dadas. Las secuencias están separadas por cualquier número de espacios en blanco. Los datos de entrada son correctos. Para cada conjunto de datos, el programa imprime en la salida estándar la longitud de la subsecuencia común de longitud máxima desde el comienzo de una línea separada.
Entrada

abcfbc abfcab
programming contest 
abcd mnp

Salida

4
2
0

2. Preguntas

Encuentre la longitud de subsecuencia común más larga de dos cadenas de caracteres.

3. Ideas

Programación dinámica
1. Deje que la matriz dp [i] [j] represente la longitud de subsecuencia común más larga antes de la posición i-ésima de la cadena a y la posición j-ésima de la cadena b. (Excluyendo el bit i y el bit j):
(1) Si a [i-1] = b [j-1], la longitud de la subsecuencia común más larga de las dos cadenas aumenta en un bit, es decir dp [i] [j] = dp [i-1] [j-1] +1.
(2) Si a [i-1]! = b [j-1], entonces dp [] i [j] hereda El mayor de dp [i-1] [j] y dp [i] [j-1], es decir, dp [i] [j] = max (dp [i-1] [j], dp [i] [j-1]).
2. El límite dp [0 ... len_a] [0] = 0, dp [0] [0 ... len_b] = 0.
3. De esta manera, dp [i] [j] solo está relacionado con el estado anterior, y toda la matriz dp se puede obtener del límite. Dp [len_a] [len_b] es la respuesta.

4. Código

#define _CRT_SECURE_NO_WARNINGS
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
const int maxn = 1000;
int dp[maxn][maxn];
char a[maxn],b[maxn];
int main()
{
	while (scanf("%s%s", a, b)!=EOF)
	{
		memset(dp, 0, sizeof(dp));
		int len_a = strlen(a);
		int len_b = strlen(b);
		for (int i = 0; i <= len_a; i++) 
			dp[i][0] = 0;
		for (int i = 0; i <=len_b; i++)
			dp[0][i] = 0;
		for (int i = 1 ; i <=len_a; i++)
		{
			for (int j = 1; j <= len_b; j++)
			{
				if (a[i-1] == b[j-1])
				{
					dp[i][j] = dp[i - 1][j - 1] + 1;
				}
				else
				{
					dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
				}
			}
		}
		printf("%d\n", dp[len_a][len_b]);
	}
	return 0;
}

Publicado 7 artículos originales · elogiado 0 · visitas 65

Supongo que te gusta

Origin blog.csdn.net/weixin_45629285/article/details/105606243
Recomendado
Clasificación