Eng uzun umumiy quyi-ketma-ketlik (LCS)
Eng uzun umumiy qismketma-ketlik (LCS)
Masala sharti
Ikki ketma-ketlik va berilgan. Eng katta umumiy ostketma-ketlik uzunligini topish talab qilinadi.
Eng uzun umumiy qismketma-ketlik (LCS)
Ikki ketma-ketlik va berilgan. Eng katta umumiy ostketma-ketlik uzunligini topish talab qilinadi.
Masalan, va ning eng katta umumiy ostketma-ketligi bo‘ladi.
ni uzunlikdagi prefiksi va uzunlikdagi prefiksi uchun yechim deb belgilaymiz. Ya’ni va ning eng katta umumiy ostketma-ketligi uzunligi.
Bazaviy holatlar:
Endi umumiy holat uchun o‘tishlarni topishga harakat qilamiz. Keling, o‘tishlarni ko‘rib chiqamiz:
Shunday qilib, formulaga ega bo‘lamiz:
Keling, har bir bazaviy bo‘lmagan holat uchun eng yaxshi o‘tishni eslab qolaylik. Ya’ni biz bilamizki, uch xil o‘tishga ega:
Boshqa massivini yaratamiz va da uchun qaysi o‘tish eng yaxshi ekanini saqlaymiz. Masalan, agar bo‘lsa, unda bo‘ladi.
Shundan so‘ng endi biz javobni tiklashimiz mumkin. ni initsializatsiya qilamiz va va bo‘lguncha quyidagilarni qilamiz.
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
dp[i][j] = 0;
dp[i][j] = max(dp[i][j], dp[i - 1][j]);
dp[i][j] = max(dp[i][j], dp[i][j - 1]);
if (a[i] == b[j]) {
dp[i][j] = max(dp[i][j], dp[i - 1][j - 1] + 1);
}
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
dp[i][j] = -1;
if (dp[i - 1][j] > dp[i][j]) {
dp[i][j] = dp[i - 1][j];
p[i][j] = 1;
}
if (dp[i][j - 1] > dp[i][j]) {
dp[i][j] = dp[i][j - 1];
p[i][j] = 2;
}
if (a[i] == b[j] && dp[i - 1][j - 1] + 1 > dp[i][j]) {
dp[i][j] = dp[i - 1][j - 1] + 1;
p[i][j] = 3;
}
}
}
vector<int> res;
int x = n, y = m;
while (x > 0 && y > 0) {
if (p[x][y] == 3) {
res.push_back(a[x]);
x -= 1;
y -= 1;
} else if (p[x][y] == 2) {
y -= 1;
} else { // p[x][y] == 1
x -= 1;
}
}
reverse(res.begin(), res.end());