❀ 題目傳送門 ❀

https://zerojudge.tw/ShowProblem?problemid=d231

❀ 解題小技巧 ❀

經典的 LCS(最長共同子序列) 題目,只要稍做一下變化就可AC。
想法是醬的:
我們要求的是兩串字中一樣的最大值,假設第一串字的每個字元的編號為 0 ~ x,第二串字的每個字元的編號為 0 ~ y

  • 若兩字串最後一字相同
    要求的東西:0 ~ x-1 字與 0 ~ y-1 字相同最大值
  • 若兩字串最後一字不相同
    要求的東西:0 ~ x-1 字與 0 ~ y 字相同最大值、0 ~ x 字與 0 ~ 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
#include <bits/stdc++.h>
using namespace std;

int main(){
string dp[55][55];
for(int i = 0; i < 55; i++){
for(int j = 0; j < 55; j++){
dp[i][j] = "";
}
}
string n, m;
cin >> n >> m;
for(int x = 1; x <= n.length(); x++){
for(int y = 1; y <= m.length(); y++){
if (n[x-1] == m[y-1]){
dp[x][y] = dp[x-1][y-1]+n[x-1];
}
else{
dp[x][y] = dp[x-1][y].length() > dp[x][y-1].length() ? dp[x-1][y] : dp[x][y-1];
}
}
}
if(dp[n.length()][m.length()] != "")
cout << dp[n.length()][m.length()];
else
cout << "E";
return 0;
}