11151
其实想通之后就是求一个串和它的反串的最长公共子序列长度。注意一点,题中没有说必须是字母,
也就是说可以是任意字符,空格就也算了,故应该整行读入。
接下来就是最长公共子序列就行了。
//============================================================================
// Name : 11151.cpp
// Author :
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
#include <string>
#include <cstdio>
using namespace std;
string s1, s2;
int dp[1010][1010];
int N;
int main() {
freopen("a.txt", "r", stdin);
cin >> N;
getchar();
while(N--){
s1.clear();
s2.clear();
getline(cin, s1);
for(int i = s1.length()-1;i >= 0;i--){
s2 += s1[i];
}
for(int i = 1;i <= s1.length();i++){
dp[i][0] = 0;
dp[0][i] = 0;
}
for(int i = 1;i <= s1.length();i++){
for(int j = 1;j <= s2.length();j++){
if(s1[i-1] == s2[j-1]){
dp[i][j] = dp[i-1][j-1]+1;
}
else{
dp[i][j] = dp[i-1][j];
if(dp[i][j] < dp[i][j-1]){
dp[i][j] = dp[i][j-1];
}
// dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
}
}
}
cout << dp[s1.length()][s2.length()] << endl;
}
return 0;
}

浙公网安备 33010602011771号