LCS algoritmo subsecuencia común más larga

Ideas:
para resolver el problema de todos los sub-s1 [1-i] y S2 [1-j]. s1 [1-i] denota el intervalo de 1 ~ s1 sub-secuencia i, s2 [1-j] denota el rango s2 subcadenas 1-j.

Por ejemplo:

#define N1 8
#define N2 9
int s1[N1+1] = {0,1,3,4,5,6,7,7,8 };
int s2[N2+1] = {0,3,5,7,4,8,6,7,8,2 };

Todas sus sub-problemas como sigue:
S1 [. ~ 1. 1], S2 [1-1 de], que requiere la más larga subsecuencia común longitud
s1 [1 ~ 1], s2 [1-2], que encontrar la longitud subsecuencia común más larga
s1 [1 ~ 1], s2 [1-2], que encontrar la más larga subsecuencia común longitud
s1 [1 ~ 1], s2 [1-3], que encontrar la más larga longitud subsecuencia común
s1 [1 ~ 1] , s2 [1-4], que encuentran la más larga subsecuencia común longitud
s1 [1 ~ 1], s2 [1-5], que encontrar la más larga subsecuencia común longitud
s1 [1 ~ 1], s2 [1-6 ], encontrar la más larga subsecuencia común de longitud
s1 [1 ~ 1], s2 [1-7], que encuentran la más larga subsecuencia común de longitud
s1 [1 ~ 1], s2 [1-8], la más larga tratan longitud subsecuencia común
s1 [1 ~ 1], s2 [1-9], que encontrar la más larga subsecuencia común longitud
s1 [1 ~ 2], s2 [1-1], que encontrar la más larga longitud subsecuencia común
S1 [ 1 ~ 2], s2 [1-2 ], que encontrar la más larga subsecuencia común longitud
s1 [1 ~ 2], s2 [13], que encontrar la más larga longitud subsecuencia común
s1 [1 ~ 2], s2 [1-4], busque la más larga subsecuencia común longitud
s1 [1 ~ 2], s2 [1-5], que encontrar la más larga subsecuencia común longitud
s1 [1 ~ 2], s2 [1-6], la búsqueda de la más larga subsecuencia común longitud
s1 [1 ~ 2], s2 [1-7] que encontrar la más larga subsecuencia común longitud
s1 [1 ~ 2], s2 [1-8] buscando la común más larga longitud de la secuencia
s1 [1 ~ 2], s2 [1-9] Buscando la más larga subsecuencia común de longitud
s1 [1 ~ 3] s2 [1-1], que encuentran la longitud subsecuencia común más larga
s1 [1 ~ 3], s2 [1-2], que encontrar la más larga subsecuencia común longitud
s1 [1 ~ 3], s2 [1-3], que encontrar la más larga longitud subsecuencia común
s1 [1 ~ 3] , s2 [1-4], que encuentran la más larga subsecuencia común longitud
s1 [1 ~ 3], s2 [1-5], que encontrar la más larga subsecuencia común longitud
s1 [1 ~ 3], s2 [1-6 ], encontrar la más larga subsecuencia común longitud
s1 [1 ~ 3], s2 [1-7], que encontrar la más larga subsecuencia común longitud
s1 [1 ~ 3], s2 [1-8], la más larga buscan longitud subsecuencia común
s1 [1 ~ 3], s2 [1-9], que encontrar la más larga subsecuencia común longitud
s1 [1 ~ 4], s2 [1-1], que encontrar la más larga longitud subsecuencia común
S1 [ 1 ~ 4], s2 [1-2 ], que encontrar la más larga subsecuencia común longitud
s1 [1 ~ 4], s2 [1-3], que encontrar la más larga longitud subsecuencia común
s1 [1 ~ 4], s2 [1-4], busque la más larga subsecuencia común longitud
s1 [1 ~ 4], s2 [1-5], que encontrar la más larga subsecuencia común longitud
s1 [1 ~ 4], s2 [1-6], la búsqueda de la más larga subsecuencia común longitud
s1 [1 ~ 4], s2 [1-7], que encontrar la más larga subsecuencia común longitud
s1 [1 ~ 4], s2 [1-8], buscando la común más larga longitud de la secuencia
s1 [1 ~ 4], s2 [1-9], que encontrar la más larga subsecuencia común longitud
s1 [1 ~ 5], s2 [1-1], que encontrar la más larga subsecuencia común longitud
s1 [1 ~ 5], s2 [1-2], busque la subsecuencia común más larga Duración
s1 [1 ~ 5], s2 [13], el cual encontrar la longitud subsecuencia común más larga
s1 [1 ~ 5], s2 [1-4], que encontrar la más larga subsecuencia común longitud
s1 [1 ~ 5], s2 [1-5], que encontrar la más larga longitud subsecuencia común
s1 [1 ~ 5] , s2 [1-6], que encuentran la más larga subsecuencia común longitud
s1 [1 ~ 5], s2 [1-7], que encontrar la más larga subsecuencia común longitud
s1 [1 ~ 5], s2 [1-8 ], encontrar la más larga subsecuencia común de longitud
s1 [1 ~ 5], s2 [1-9], que encuentran la más larga subsecuencia común de longitud
s1 [1 ~ 6], s2 [1-1], el más largo buscan longitud subsecuencia común
s1 [1 ~ 6], s2 [1-2], que encontrar la más larga subsecuencia común longitud
s1 [1 ~ 6], s2 [1-3], que encontrar la más larga longitud subsecuencia común
S1 [ 1 ~ 6], s2 [1-4 ] que encontrar la más larga subsecuencia común longitud
s1 [1 ~ 6], s2 [1-5] que encontrar la más larga longitud subsecuencia común
s1 [1 ~ 6], s2 [1-6], busque la más larga subsecuencia común longitud
s1 [1 ~ 6], s2 [1-7], que encontrar la más larga subsecuencia común longitud
s1 [1 ~ 6], s2 [1-8], la búsqueda de la más larga subsecuencia común de longitud
s1 [1 ~ 6], s2 [1-9], que encuentran la más larga subsecuencia común de longitud
s1 [1 ~ 7], s2 [1-1], buscando el común más larga longitud de la secuencia
s1 [1 ~ 7], s2 [1-2], que encontrar la más larga subsecuencia común longitud
s1 [1 ~ 7], s2 [1-3], que encontrar la más larga subsecuencia común longitud
s1 [1 ~ 7], s2 [1-4], busque la subsecuencia común más larga Duración
s1 [1 ~ 7], s2 [1-5], que encuentran la longitud subsecuencia común más larga
s1 [1 ~ 7], s2 [1-6], que encontrar la más larga subsecuencia común longitud
s1 [1 ~ 7], s2 [1-7], que encontrar la más larga longitud subsecuencia común
s1 [1 ~ 7] , s2 [1-8], que encuentran la más larga subsecuencia común longitud
s1 [1 ~ 7], s2 [1-9], que encontrar la más larga subsecuencia común longitud
s1 [1 ~ 8], s2 [1-1 ], encontrar la más larga subsecuencia común de longitud
s1 [1 ~ 8], s2 [1-2], que encuentran la más larga subsecuencia común de longitud
s1 [1 ~ 8], s2 [1-3], el más largo buscan longitud subsecuencia común
s1 [1 ~ 8], s2 [1-4], que encontrar la más larga subsecuencia común longitud
s1 [1 ~ 8], s2 [1-5], que encontrar la más larga longitud subsecuencia común
S1 [ 1 ~ 8], s2 [1-6 ], que encontrar la más larga subsecuencia común longitud
s1 [1 ~ 8], s2 [1-7], que encontrar la más larga longitud subsecuencia común
s1 [1 ~ 8], s2 [1-8], encontramos la más larga subsecuencia común de longitud
s1 [1 ~ 8], s2 [1-9], que encuentran la longitud subsecuencia común más larga

La respuesta a todos los sub-problemas están presentes en la matriz bidimensional m.
Invertir matriz bidimensional de respuestas de salida, como proceso específico ver directamente el código.


Código se implementa de la siguiente manera:

#include <iostream>
using namespace std;

int main()
{
#define N1 8
#define N2 9
    int s1[N1+1] = {0,1,3,4,5,6,7,7,8 };
    int s2[N2+1] = {0,3,5,7,4,8,6,7,8,2 };
    int m[9][10] = { 0 };

    for (int i = 1; i <= N1; i++) {
        for (int j = 1; j <= N2; j++) {
            if (s1[i] == s2[j]) {
                m[i][j] = m[i-1][j-1] + 1;
            }else{
                if (m[i - 1][j] > m[i][j - 1]) {
                    m[i][j] = m[i-1][j];
                }
                else {
                    m[i][j] = m[i][j-1];
                }
            }
        }
    }

    // 输出数组m
    for (int i = 0; i <= N1; i++) {
        for (int j = 0; j <= N2; j++) {
            cout << m[i][j] << " ";
        }
        putchar(10);
    }

    // 输出答案
    cout << "倒序输出答案:";
    int i = N1, j = N2;
    while (i >= 1 && j >= 1) {
        if (s1[i] == s2[j]) {
            cout << s1[i] << " ";
            i--; j--;
        }
        else {
            if (m[i - 1][j] > m[i][j - 1]) {
                i--;
            }
            else {
                j--;
            }
        }
    }


    putchar(10);
    return 0;
}


Referencia: https: //blog.csdn.net/UncleJokerly/article/details/79701073

Publicado 92 artículos originales · ganado elogios 2 · Vistas 3421

Supongo que te gusta

Origin blog.csdn.net/zxc120389574/article/details/105033264
Recomendado
Clasificación