[POJ - 1458] Общие подпоследовательности (динамическое программирование)

Общие подпоследовательности


 Описания:

Подпоследовательность данной последовательности является данной последовательностью с некоторыми элементами (возможно ни одного) опущен. Учитывая последовательность X = <x1, x2, ..., хт> другая последовательность Z = <z1, z2, ..., гк> подпоследовательность X , если существует строго возрастающая последовательность <i1, i2, .. ., ик> индексов X такое , что для всех у = 1,2, ..., к, х  я J  = Zj. Например, Z = <а, Ь, е, с> подпоследовательность X = <а, б, в, е, б, в> с индексом последовательности <1, 2, 4, 6>. С учетом двух последовательностей X и Y задача состоит в нахождении длины максимальной длины общей подпоследовательности X и Y.

вход

Входная программа от входа станд. Каждый набор данных во входных данных содержит две строки, представляющие данные последовательности. Последовательности разделены любым числом пробелов. Входные данные являются правильными.

Выход

Для каждого набора данных программа печатает на стандартный вывод длина максимальной длины общей подпоследовательности с начала отдельной строкой.

Пример ввода

abcfbc abfcab

соревнование по программированию

ABCD MNP

Пример вывода

4

2

0

подключение Тема: https://vjudge.net/problem/POJ-1458

С учетом эффекта

Учитывая две строки, первая длина, чтобы определить самую длинную общую подпоследовательность: подпоследовательности каждая строка может быть найден в обоих исходных строк и исходную последовательность и каждая строка символов последовательны в порядке

 

Массив расположен ДП [I] [J], я представляет собой позицию первой строки I, J J обозначает положение второй строки, если s1 [я] == s2 [J ] J, то DP [я] [J] = дп [i - 1] [J-1] +1. в противном случае DP [I] , [Дж] = тах ( ДП [. 1-я] [J], ДП [I] , [J-. 1] ). не могу понять, вы можете нажать на образец , чтобы нарисовать таблицу , чтобы попытаться узнать

 

AC код

#include <iostream> 
#include <cstdio> 
#include <fstream> 
#include <алгоритм> 
#include <CMATH> 
#include <Deque> 
#include <вектор> 
#include <очереди> 
#include < строка > 
#include <CString> 
# include <карта> 
#include <стек> 
#include < набор > 
#include <sstream>
 #define ME0 (Х) MemSet ((Х), 0, SizeOf ((X)))
 с использованием  пространства имен STD;
строка s1, s2;
1005 ] [ 1005 ];
ИНТ основной () 
{ в 
    то время как (CIN >> s1 >> s2) 
    { 
        ME0 (дп); 
        INT len1 = s1.length ();
        INT len2 = s2.length ();
        для ( INT I = 1 , я <= len1; я ++ ) 
        { 
            для ( Int J = 1 , J <= len2; j ++ ) 
            { 
                если (s1 [i - 1 ] == s2 [j - 1 ]) 
                    дп [I ] [J] = дп [i - 1 ] [j - 1] + 1 ;
                остальное 
                { 
                    дп [I] [J] = макс (дп [I] [j - 1 ], дп [i - 1 ] [J]); 
                } 
            } 
        } 
        СоиЬ << дп [len1] [len2] << епсИ; 
    } 
}

 

 

 

рекомендация

отwww.cnblogs.com/sky-stars/p/10936527.html