https://www.acmicpc.net/problem/9251
๋ฌธ์
LCS(Longest Common Subsequence, ์ต์ฅ ๊ณตํต ๋ถ๋ถ ์์ด)๋ฌธ์ ๋ ๋ ์์ด์ด ์ฃผ์ด์ก์ ๋, ๋ชจ๋์ ๋ถ๋ถ ์์ด์ด ๋๋ ์์ด ์ค ๊ฐ์ฅ ๊ธด ๊ฒ์ ์ฐพ๋ ๋ฌธ์ ์ด๋ค.
์๋ฅผ ๋ค์ด, ACAYKP์ CAPCAK์ LCS๋ ACAK๊ฐ ๋๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค๊ณผ ๋์งธ ์ค์ ๋ ๋ฌธ์์ด์ด ์ฃผ์ด์ง๋ค. ๋ฌธ์์ด์ ์ํ๋ฒณ ๋๋ฌธ์๋ก๋ง ์ด๋ฃจ์ด์ ธ ์์ผ๋ฉฐ, ์ต๋ 1000๊ธ์๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง ๋ ๋ฌธ์์ด์ LCS์ ๊ธธ์ด๋ฅผ ์ถ๋ ฅํ๋ค.
๋ฐฑ์ค ๊ณจ๋5ํฐ์ด.
์ฒ์์ ์๊ฐ์ ํ์ด 0.1์ด๊ธธ๋ ์ํ์ผ๋ก๋ ๋ชปํ๊ฒ ๊ตฌ๋ ํ๋๋ฐ ์ญ์ ํ๋ฆผ
๊ทธ๋์ ์์ ํ DP๋ก ํด๊ฒฐํ์ต๋๋ค..
์ ํ์์ ๋ ์ฌ๋ฆฌ๊ธฐ ํ๋ค์๋๋ฐ, ํ ๋ธ๋ก๊ฑฐ์ ์ ์ ๋ฆฌ๋ ๊ธ์ ์ฝ๊ณ ์ด์ฐจ์๋ฐฐ์ด์ ์ด์ฉํด์ ํด๊ฒฐํจ
์๋ฅผ ๋ค์ด, ๋ฌธ์์ด์ด ABA ์ CADB ์ผ ๋
์๋์ ๊ฐ์ด ํ๋ฅผ ๋ง๋ค ์ ์๋ค.
A | B | A | |
C | don't match -> 0 | 0 | 0 |
A | match! -> 1 | 1 | 1 |
D | don't match -> 1 | 1 | 1 |
B | don't match -> 1 | match! -> 2 | 2 |
1์ด์ ์ดํด๋ณด๋ฉด,
๋ฌธ์์ด A์ C ์ lcs length = 0
๋ฌธ์์ด A์ CA ์ lcs length = 1
๋ฌธ์์ด A์ CAD ์ lcs length = 1
๋ฌธ์์ด A์ CADB ์ lcs length = 1
2์ด์ ์ดํด๋ณด๋ฉด,
๋ฌธ์์ด AB์ C ์ lcs length = 0
๋ฌธ์์ด AB์ CA ์ lcs length = 1
๋ฌธ์์ด AB์ CAD ์ lcs length = 1
๋ฌธ์์ด AB์ CADB ์ lcs length = 2
์ด์ ๊ฐ์ด ๋์ดํด๋ณด๋ฉด ๊ท์น์ ์ฐพ์ ์๋์ ๊ฐ์ ์ ํ์์ ๋ ์ฌ๋ฆด ์ ์๋ค.
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]);
}
๋์ ํ์ด
#include <iostream>
#include <string>
using namespace std;
int main(){
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
string a;
string b;
cin >> a >> b;
int dp[1001][1001] = {{0}};
for (int i = 1; i <= a.length(); ++i){
for (int j = 1; j <= b.length(); ++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]);
}
}
}
cout << dp[a.length()][b.length()];
}
'๐ ์๊ณ ๋ฆฌ์ฆ > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C++/BOJ] 12865 : ํ๋ฒํ ๋ฐฐ๋ญ (DP) / ํ ์คํธ์ผ์ด์ค ํฌํจ (1) | 2023.03.17 |
---|---|
[C++/BOJ] 1890 : ์ ํ (DP) (1) | 2023.03.16 |
[C++/BOJ] 9465 : ์คํฐ์ปค (DP) (0) | 2023.03.15 |
[C++/BOJ] 10971 : ์ธํ์ ์ํ 2 (์์ ํ์, dfs, Backtracking) (0) | 2023.03.06 |
[C++/BOJ] 9663 : N-Queen (์์ ํ์, Backtracking) (0) | 2023.03.06 |