문제: icpc.me/9252
LCS를 구해주는 문제이다. 다이나믹 프로그래밍을 통하여 LCS를 구해준 뒤 백트래킹하여 해당 LCS를 출력해주면 된다.
dp테이블의 정의는 dp[x][y]는 첫번째 문자열을 x까지 두번째 문자열을 y까지 봤을 때 LCS의 크기이다.
점화식은 (if a[x]!=b[y]) dp[x][y]=max(dp[x][y-1],dp[x-1][y]) else dp[x][y]=dp[x-1][y-1] 이 된다.
소스코드에서는 테이블의 정의를 반대로 사용하였다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | #include <cstdio> #include <algorithm> #include <cstring> #include <string> #include <iostream> using namespace std; string a, b; int dp[1001][1001]; pair<int, int> back[1001][1001]; int alen, blen; int func(int i, int j){ if (alen == i || blen == j)return 0; int& ret = dp[i][j]; if (ret != -1)return ret; if (a[i] == b[j]) { back[i][j] = { i + 1,j + 1 }; return ret = 1 + func(i + 1, j + 1); } int x = func(i + 1, j); int y = func(i, j + 1); if (x > y) { back[i][j] = { i + 1,j }; return ret = x; } else { back[i][j] = { i,j + 1 }; return ret = y; } } int main(){ cin >> a >> b; alen = a.size(); blen = b.size(); memset(dp, -1, sizeof(dp)); printf("%d\n", func(0, 0)); int x, y; x = y = 0; while (x != alen&&y != blen) { if (a[x] == b[y]) printf("%c", a[x]); int tx = x; x = back[x][y].first; y = back[tx][y].second; } return 0; } | cs |
'알고리즘 관련 > BOJ' 카테고리의 다른 글
BOJ)5052 전화번호 목록 (0) | 2017.02.03 |
---|---|
BOJ)2662 기업투자 (0) | 2017.02.03 |
BOJ)1701 Cubeditor (0) | 2017.02.01 |
BOJ)11585 속타는 저녁 메뉴 (0) | 2017.02.01 |
BOJ)4354 문자열 제곱 (0) | 2017.02.01 |