LCS
์๊ฐ ์ ํ | ๋ฉ๋ชจ๋ฆฌ ์ ํ | ์ ์ถ | ์ ๋ต | ๋ง์ ์ฌ๋ | ์ ๋ต ๋น์จ |
---|---|---|---|---|---|
1 ์ด | 256 MB | 19827 | 8068 | 6050 | 41.148% |
๋ฌธ์
LCS(Longest Common Subsequence, ์ต์ฅ ๊ณตํต ๋ถ๋ถ ์์ด)๋ฌธ์ ๋ ๋ ์์ด์ด ์ฃผ์ด์ก์ ๋, ๋ชจ๋์ ๋ถ๋ถ ์์ด์ด ๋๋ ์์ด ์ค ๊ฐ์ฅ ๊ธด ๊ฒ์ ์ฐพ๋ ๋ฌธ์ ์ด๋ค.
์๋ฅผ ๋ค์ด, ACAYKP์ CAPCAK์ LCS๋ ACAK๊ฐ ๋๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค๊ณผ ๋์งธ ์ค์ ๋ ๋ฌธ์์ด์ด ์ฃผ์ด์ง๋ค. ๋ฌธ์์ด์ ์ํ๋ฒณ ๋๋ฌธ์๋ก๋ง ์ด๋ฃจ์ด์ ธ ์์ผ๋ฉฐ, ์ต๋ 1000๊ธ์๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง ๋ ๋ฌธ์์ด์ LCS์ ๊ธธ์ด๋ฅผ ์ถ๋ ฅํ๋ค.
์๊ณ ๋ฆฌ์ฆ ๋ถ๋ฅ
- ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ
๋์ ๋ต
์๊ฐ์ ํ๋ฆ
-
์์ ํ์
์กฐ๊ฑด ์ค๋ ์๊ฐ ์ด๊ณผ
-
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ
์ฐ์ ์์ ํ์์ ๊ตฌํํ ๋๋ s1์ ๊ธธ์ด๋งํผ ์ํํ๋ฉด์ ๊ฐ index๋ง๋ค s2์ ๊ธธ์ด๋งํผ์ ์ํํ๊ณ ํด๋น ๋ถ๋ถ ๋ฌธ์์ด๋ค์ LCS ๊ธธ์ด๋ฅผ ๊ตฌํด์ผํ๋ค.
ํ์ง๋ง ๋ถ๋ถ๋ฌธ์ ๋ก ๋๊ณ ๋ณธ๋ค๋ฉด ๋๊ฐ์ง ๊ฒฝ์ฐ๋ก ๋๋ ์ ์๋ค.
-
ํ์ฌ ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๊ณ ์๋ ๋ณ์ ๊ฐ์ด ๋ค๋ฅด๋ค๋ฉด
ํ์ฌ์ LCS ๊ธธ์ด๋ 2๋ฒ์งธ ๊ทธ๋ฆผ(s1์ ํฌ์ธํฐ 1์ฆ๊ฐ)๊ณผ 3๋ฒ์งธ ๊ทธ๋ฆผ(s2์ ํฌ์ธํฐ 1์ฆ๊ฐ) ์ค์ ํฐ ๊ฐ๊ณผ ๊ฐ๋ค.
ํ์ฌ index์์ A, C๋ ๊ฐ์ง ์๊ธฐ ๋๋ฌธ์ s1, s2์ LCS๊ฐ ๋ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
-
ํ์ฌ ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๊ณ ์๋ ๋ณ์ ๊ฐ์ด ๊ฐ๋ค๋ฉด
ํ์ฌ์ LCS ๊ธธ์ด๋ s1๊ณผ s2์ ํฌ์ธํฐ๋ฅผ 1์ฉ ์ฆ๊ฐํ 2๋ฒ์งธ ๊ทธ๋ฆผ์ LCS ๊ธธ์ด ๊ฐ๊ณผ ๊ฐ๋ค.
ํ์ฌ index์์ A, A๊ฐ ๊ฐ๊ธฐ ๋๋ฌธ์ LCS๊ฐ ๋ ์ ์์ด์ ๊ธธ์ด๋ 1์ฆ๊ฐํ๋ฉฐ ์ด๋ฅผ ์ ์ธํ ๋ค์๋ถ๋ถ๋ถํฐ ๊ฒ์ฌํ๋ฉด ๋๋ค.
์ฝ๋
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;
string s1, s2;
int memorize[1001][1001];
int LCS(int p1, int p2) {
if (memorize[p1][p2] != -1)
return memorize[p1][p2];
if (p1 >= s1.length() || p2 >= s2.length())
return 0;
if (p1 == s1.length() - 1 && p2 == s2.length() - 1) {
memorize[p1][p2] = (s1[p1] == s2[p2]);
return memorize[p1][p2];
}
int max_result;
if (s1[p1] == s2[p2])
max_result = LCS(p1 + 1, p2 + 1)+1;
else
max_result = max(LCS(p1 + 1, p2), LCS(p1, p2 + 1));
memorize[p1][p2] = max_result;
return max_result;
}
int main() {
getline(cin, s1);
getline(cin, s2);
fill(&memorize[0][0], &memorize[1000][1001], -1);
int answer = LCS(0,0);
cout << answer;
}
ํ ์คํธ ์ผ์ด์ค
1000๊ฐ์ง๋ฆฌ
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ACAYKP
CAKPAB
4
CBCBCBCB
BCBCBCA
6
APPLEY
APALPEY
5
PPPPP
PPPPPPPPPP
5
PPPPP
PPAPPAAP
5
ABCABC
CBACBA
3
ABCABC
ACBACB
4
BCDEFGHA
ACDEFGHB
6
1000๊ฐ์ testcase๋ฅผ ๋๋ ค๋ณด์๋๋ฐ ์๊ฐ๋ณด๋ค ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ์ง ์์ ๋ฐ๋ก ์ ์ถํ๋ค.
๋ค๋ฅธ ๋ต
#include <iostream>
#include <string>
using namespace std;
int dp[1001][1001];
int main() {
string s1, s2;
getline(cin, s1);
getline(cin, s2);
for (int j = 0; j < s2.length(); j++) {
dp[0][j] = 0;
}
for (int i = 0; i < s1.length(); i++) {
dp[i][0] = 0;
}
for (int i = 1; i <= s1.length(); i++) { // s1
for (int j = 1; j <= s2.length(); j++) { // s2
if (s1[i-1] != s2[j-1]) {
dp[i][j] = dp[i-1][j] > dp[i][j - 1] ? dp[i-1][j] : dp[i][j - 1];
}
else {
dp[i][j] = dp[i - 1][j - 1] + 1;
}
}
}
cout << dp[s1.length()][s2.length()];
}
http://melonicedlatte.com/algorithm/2018/03/15/181550.html
์ฌ๋๋ค์ ๋๋ฌด ๋๋ํ๋ค :>
์ฌ๊ธฐ์ ์์ ์ผ์ชฝ ์ค์ ํฐ ๊ฐ์ ํํ๋ ๋ถ๋ถ์ ๋ณธ์ธ์ ์ฝ๋์์ ์์์ ๊ฐ์ด ๋ค๋ฅผ ๋ 2๊ฐ์ง LCS ์ฌ๊ทํจ์๋ฅผ ํธ์ถํ ๋ถ๋ถ์ด๊ณ , ๋๊ฐ์ ์ ๊ฐ + 1์ ํ ๋ถ๋ถ์ ์์์ ๊ฐ์ด ๊ฐ์ ๋ ๋ค์ index์ LCS ๊ฐ์ 1์ ๋ํ ๋ถ๋ถ์ด๋ค.
๋ณธ์ธ๊ณผ ๋ค๋ฅธ์
-
์์ ํ์
๋ณธ์ธ์ ์กฐ๊ฑด์ ์ค์ ๊ฐ์ ์์๊ฐ ๋์ฌ ๊ฒฝ์ฐ 2๊ฐ์ง ๊ฒฝ์ฐ๋ ์คํ ์ํด๋ ๋๊ฒ๋ ๋ง๋ค์๋ค. ํ์ง๋ง ์์ ์ฝ๋๋ i๋ฅผ s1์ ๊ธธ์ด๋งํผ, j๋ฅผ s2์ ๊ธธ์ด๋งํผ ๋๋ฆฌ๋ฉด์ ์์ ํ์ํ์๋ค.
-
๋ฉ๋ชจ์ด์ ์ด์
๋ณธ์ธ์ 2์ฐจ์ arr ๋ฉ๋ชจ์ด์ ์ด์ ์ ์ฌ์ฉํ์ฌ ์ด๋ฏธ ๊ตฌํ ๊ฐ์ผ ๊ฒฝ์ฐ return ํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ๋ค. ํ์ง๋ง ์์ ์ฝ๋๋ ๋ฉ๋ชจ์ด์ ์ด์ array๋ฅผ ์ง์ ์ฌ์ฉํ๋ ํํ๋ก์จ ์ฌ๊ทํจ์๋ฅผ ํ ํ์๊ฐ ์์ด์ ์๊ฐ์ด ๋ง์ด ๋จ์ถ๋์๋ค.
์์ชฝ์ด ๋ณธ์ธ์ ์ฝ๋, ์๋์ชฝ์ด ์ ๋งํฌ์ ์ฝ๋์ด๋ค.
'Algorithm ๋ฌธ์ > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[c++] BOJ 1309๋ฒ :: ๋๋ฌผ์ (0) | 2020.04.25 |
---|---|
[c++] BOJ 1461๋ฒ :: ๋์๊ด (0) | 2020.04.23 |
[c++] BOJ 1149๋ฒ :: RGB๊ฑฐ๋ฆฌ (0) | 2020.04.16 |
[c++] BOJ 1417๋ฒ :: ๊ตญํ์์ ์ ๊ฑฐ (0) | 2020.04.10 |
[c++] BOJ 1038๋ฒ :: ๊ฐ์ํ๋ ์ (0) | 2020.04.05 |
Comment