반응형
문제 주소
9251번: LCS
LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다. 예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.
www.acmicpc.net
알고리즘
DP
힌트
첫번째 문자열의 i번 문자까지의 문자열과 두번째 문자열의 j번 문자까지의 문자열의 LCS의 길이를 구한다.
문제풀이
dp[i][j]
에 문자열 a
의 i번 문자까지의 문자열과 문자열 b
의 j번 문자까지의 문자열의 LCS의 길이를 저장한다.
가장 끝의 문자만 비교하는 식으로 길이를 구해나갈 수 있다.
- 끝 문자가 같을 경우
dp[i][j] = dp[i-1][j-1]+1
- 끝 문자가 다를 경우
dp[i][j]
는dp[i][j-1]
과dp[i-1][j]
중 더 큰 값이 된다.
#include<iostream>
#include<string>
using namespace std;
int dp[1001][1001];
int main(){
string a,b;
cin>>a;
cin>>b;
int n=a.length(), m=b.length();
for(int i=1;i<=n;i++){
for(int j=1;j<=m;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[n][m];
}
반응형
'Problem Solve > Dynamic Programming' 카테고리의 다른 글
[백준] 2565번 전깃줄 (C) (0) | 2020.04.12 |
---|---|
[백준] 11054번 가장 긴 바이토닉 부분 수열 (C) (0) | 2020.04.09 |
[백준] 11053번 가장 긴 증가하는 부분 수열 (C) (0) | 2020.04.06 |
[백준] 2156번 포도주 시식 (C) (0) | 2020.03.30 |
[백준] 10844번 쉬운 계산 수 (C) (0) | 2020.03.30 |