리뷰
https://www.acmicpc.net/problem/9251
문자열 두개 중 최장 공통 부분 수열의 길이를 구하는 문제
전역 변수
- dp : 문자열 a, b의 LCS를 동적계획법으로 찾으며 각 단계를 저장할 2차원 정수 배열 크기는 1001 * 1001로 초기화
함수
없음
문제풀이
- 문자열 두개를 각각 문자열 변수 a, b에 저장한다.
- a, b의 길이를 각각 정수형 변수 len1, len2에 저장한다.
- len1 * len2 크기의 2중 for문을 개행해 준다. 이때 인덱스는 1부터 문자열의 길이까지 포함되도록 한다.
- a, b의 현재 탐색범위 이전의 문자가 같을 경우 현재 dp인덱스를 이전 dp인덱스 + 1로 저장해 준다.
- 같지 않을 경우 i의 현재 인덱스, j의 이전 인덱스값과 i의 이전 인덱스, j의 현재 인덱스 값을 비교한다.
- 더 큰 값을 dp의 현재 인덱스로 저장해 준다,
- 탐색을 마친 후 dp배열의 len1, len2 인덱스에 저장된 값을 출력해 준다.
참고 사항
점화식
if (a[i - 1] == b[j - 1]) dp[i][j] = dp[i - 1][j - 1] + 1;
else dp[i][j] = max(dp[i][j - 1], dp[i - 1][j]);
정답 코드
#include<iostream>
using namespace std;
int dp[1001][1001];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
string a, b;
cin >> a >> b;
int len1 = a.size(), len2 = b.size();
for (int i = 1; i <= len1; i++) {
for (int j = 1; j <= len2; j++) {
if (a[i - 1] == b[j - 1]) dp[i][j] = dp[i - 1][j - 1] + 1;
else dp[i][j] = max(dp[i][j - 1], dp[i - 1][j]);
}
}
cout << dp[len1][len2];
}
728x90
'알고리즘 공부 > C++' 카테고리의 다른 글
[P3] 백준 14288번 회사 문화 4 C++ 세그먼트 트리, 느리게 갱신되는 세그먼트 트리, 오일러 경로 테크닉 (2) | 2024.10.18 |
---|---|
[P3] 백준 14287번 회사 문화 3 C++ 세그먼트 트리, 오일러 경로 테크닉 (1) | 2024.10.17 |
[G4] 백준 1062번 가르침 C++ 백트래킹 (0) | 2024.10.15 |
[G5] 백준 10472번 십자뒤집기 C++ 비트마스킹, BFS, 브루트포스 알고리즘 (0) | 2024.10.15 |
[S2] 백준 2961번 도영이가 만든 맛있는 음식 C++ 백트래킹 (1) | 2024.10.15 |