51nod
题目链接
注意的地方
1.将字符串右移一位,让0号位空出来
2.寻找子序列的过程,是先尽量往上左上走,当不能走的时候再斜着走。
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
using namespace std;
int dp[1005][1005]={0};
int main(){
string a, b;
getline(cin, a);
getline(cin, b);
string res;
a = ' ' + a;
b = ' ' + b;
for(int i = 1; i < a.size(); i++){
for(int j = 1; j < b.size(); j++){
if(a[i] == b[j]) {
dp[i][j] = dp[i-1][j-1] + 1;
}
else dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
}
}
int i = a.size() - 1, j = b.size() - 1;
while(dp[i][j]){
if(dp[i][j] == dp[i-1][j]) i--;
else if(dp[i][j] == dp[i][j-1]) j--; //先尽量往左上移
else{
res += a[i];
i--;
j--;
}
}
reverse(res.begin(), res.end());
cout<<res<<endl;
return 0;
}