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; }