UVA 11151

  題意:求最長迴文子序列。

  思路:狀態dp(i,j)表示從i到j的最長迴文子序列長度,那麼

    dp(i,j)=dp(i+1,j-1)+2,str[i]==str[j]

    dp(i,j)=max(dp(i+1,j),dp(i,j-1)),str[i]!=str[j]

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
int dp[1010][1010];
char t[1010];
int main()
{
	int T;
	cin>>T;getchar();
	while(T--){
		cin.getline(t,1000);
		int len=strlen(t);
		if(len<2) {cout<<len<<endl;continue;}
		memset(dp,0,sizeof(dp));
		for(int i=1;i<=len;i++) dp[i][i]=1;
		for(int l=2;l<=len;l++)
			for(int j,i=1;(j=i+l-1)<=len;i++)
				if(t[i-1]==t[j-1]) dp[i][j]=dp[i+1][j-1]+2;
				else dp[i][j]=max(dp[i+1][j],dp[i][j-1]);
		cout<<dp[1][len]<<endl;
	}
	return 0;
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章