LCS๋ Longest Common Subsequence์ ์ฝ์๋ก ์ด ๋ฌธ์ ์ ๋ชฉ์๋ ๋๋๊ณ ์ฐ์๋ค. ์ฒ์ ์ ํ์ ๋ ์๊ฐํ๊ธฐ ์ด๋ ค์ด DP์ด๊ณ , ๊ฐ๊ฐ์ด ๋ฉธ๋ง. ์๋ URL์ ํ์ด๋ฅผ ๊ฑฐ์ ๊ทธ๋๋ก ์ฐธ๊ณ ํ๋ค.
ํด๋น ๊ธ์์ ์ค๋ช ๋ฐฉ๋ฒ์ด ์์ฃผ ์ข์๋ฐ, ์ฐ์ Longest Common String(Substring?)์ ๋จผ์ ๊ตฌํ๋ ๋ฐฉ๋ฒ์ ๋ํด์ ์์๋ณด์. "์ฐ์๋๋ค"๋ ์กฐ๊ฑด ๋๋ฌธ์ ์ด ๊ฒฝ์ฐ ์ ์ฒด ๋ชจ์์ด ์๋์ฒ๋ผ ๋๋ค.
for() {for() {if (A[a] == B[b]) DP[i][j] = DP[i-1][j-1] + 1;else DP[i][j] = 0;}}
์ฌ์ค ๋ชจ์์ ๋ณด๋ฉด ์๊ฒ ์ง๋ง ๊ตณ์ด 2์ฐจ์ DP
๋ฐฐ์ด์ ์ธ ํ์๋ ์๋ค. ๋ฐฐ์ด์์์ ๊ฒฐ๊ณผ๋ ๋๊ฐ์ ๋ฐฉํฅ๋ง ์กด์ฌํ๋ค. ์ค๊ฐ์ ์๋ก ๋ค๋ฅธ ๋ฌธ์์ด์ด ๋์ค์๋ง์ ์นผ๊ฐ์ด 0์ผ๋ก ๋ง๋ค์ด ์ฃผ๋ ๊ฒ์ด ํฌ์ธํธ์ด๋ค.
์ฌ๊ธฐ์ ์ฌ๊ณ ๋ฅผ ํ์ฅํด๋ณด์. 0์ผ๋ก ๋ง๋๋ ์ด์ ๋ ์ฐ์
๋๋ค๋ ์กฐ๊ฑด์ด ์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ ๋ค๋ฉด ์ฐ์
๋๋ค๋ ์กฐ๊ฑด์ด ์์ ๋๋ ์ด๋ป๊ฒ ๋ ๊ฒ์ธ๊ฐ? ์ด ๊ฒฝ์ฐ ํ์ฌ๊น์ง์ ์ต๋ ๊ณตํต ๋ถ๋ถ ๊ธธ์ด๊ฐ ์ ์ง๊ฐ ๋์ด์ผ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ์ ์ง๋ x์ถ์ผ๋ก ํด์ผํ ์๋ ์๊ณ , y์ถ์ผ๋ก ํด์ผํ ์๋ ์๊ธฐ ๋๋ฌธ์ x, y์ถ์ ๋ํ max
๊ฐ์ ๊ตฌํด์ฃผ๋ฉด ๋๊ฒ ๋ค. ๊ทธ๋์ ์ DP
์์ด ์์ฃผ ์ฝ๊ฐ ๋ฐ๋๋ค.
for() {for() {if (A[a] == B[b]) DP[i][j] = DP[i-1][j-1] + 1;else DP[i][j] = max(DP[i-1][j], DP[i][j-1]);}}
๊ทธ๋ฆฌ๊ณ , ์ด๋ฌํ ์กฐ๊ฑด์ ๋ง์กฑํ๋ LCS
๋ฅผ ํ๋ ์ถ๋ ฅํ๋ผ๊ณ ํ๋ฉด, ๊ทธ๊ฒ์ DP
๋ฐฐ์ด์ ํ์ฉํด์ ๋๊ฐ ๋ฐฉํฅ์ผ๋ก ์ซ์๊ฐ ์ฆ๊ฐํ๋ path
๋ฅผ ์ ๋ฐ๋ผ๊ฐ๋ฉด ๋๋ค. ๊ฒฐ๊ณผ๋ ์ญ๋ฐฉํฅ์ผ๋ก ์ถ๋ ฅํ๋ฉด ๋๋ค.
vector<char> word;int ap = alen, bp = blen;while(ap != 0 && bp != 0) {if (DP[bp][ap] == DP[bp][ap-1]) {ap--;continue;}if (DP[bp][ap] == DP[bp-1][ap]) {bp--;continue;}word.push_back(A[ap]);ap--;bp--;}if (word.size()) {for(auto it = word.rbegin(); it != word.rend(); ++it){printf("%c", *it);}printf("\n");}
์ค๋๋ DP
์ 1ํจ๋ฅผ ํ๋ค. ์ผ์
!