문제링크 : https://www.acmicpc.net/problem/1958
1958번: LCS 3
첫 줄에는 첫 번째 문자열이, 둘째 줄에는 두 번째 문자열이, 셋째 줄에는 세 번째 문자열이 주어진다. 각 문자열은 알파벳 소문자로 이루어져 있고, 길이는 100보다 작거나 같다.
www.acmicpc.net
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MAX = 987654321;
int dp[101][101][101];
string s1, s2, s3;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> s1 >> s2 >> s3;
for(int i=1; i<=s1.size(); i++)
{
for(int j=1; j<=s2.size(); j++)
{
for(int k=1; k<=s3.size(); k++)
{
if(s1[i-1]==s2[j-1] && s2[j-1]==s3[k-1]) //3개 문자가 모두 같은 경우
{
dp[i][j][k] = dp[i-1][j-1][k-1] + 1; //이전 공통 부분 + 1
}
else
{
dp[i][j][k] = max({dp[i-1][j][k], dp[i][j-1][k], dp[i][j][k-1]}); //최대값 저장
}
}
}
}
cout << dp[s1.size()][s2.size()][s3.size()];
}
문제풀이 참고 링크 : https://blob-thinking.tistory.com/270
[백준 9252번] LCS 2 (C++)
문제링크 : https://www.acmicpc.net/problem/9252 9252번: LCS 2 LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다. 예
blob-thinking.tistory.com
기존 LCS 문제에서 문자열의 갯수가 늘어난 문제이다.
dp 배열이 확장된 것을 제외하면 사실상 로직은 동일하다.
처음에 LCS를 2번 (s1, s2 / s2, s3) 돌리는 방식으로 풀다가 잘 안되어서 찾아보니 문자열의 길이가 100이라 3중 for문으로 풀린다는 것을 알았다.
'백준 > 골드' 카테고리의 다른 글
[백준 12869번] 뮤탈리스크 (C++) (0) | 2023.11.23 |
---|---|
[백준 1520번] 내리막 길 (C++) (0) | 2023.11.21 |
[백준 15486번] 퇴사 2 (C++) (0) | 2023.11.16 |
[백준 1083번] 소트 (C++) (0) | 2023.11.14 |
[백준 12904번] A와 B (C++) (0) | 2023.11.13 |