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

  

posted @ 2011-07-25 23:32  KOKO's  阅读(414)  评论(0编辑  收藏  举报