最长回文子序列


          和lcs差不多,也可以用递归来写,但是会重复处理很多次,所以还是考虑用动态规划来写。它的动态转移方程为

                 

str[i]==str[j]时,i->j的最长回文子序列就等于,在 i->j 之间上一个最长回文子序列的基础上+2

str[i]!=str[j]时,i->j的最长回文子序列就等于在i+1->j 和 i->j-1中最长回文子序列较长的一个

最终的dp[0][len-1]就是最长回文子序列。


实现代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#define Max(a,b) a>b?a:b
using namespace std;
int dp[1500][1500];

int main()
{
	string str;
	while(cin>>str){
		int len = str.length();
		memset(dp,0,sizeof(dp));
		for(int i=len-1;i>=0;i--){
			dp[i][i] = 1;
			for(int j=i+1;j<len;j++){
				if(str[i] == str[j])dp[i][j] = dp[i+1][j-1] + 2;
				else dp[i][j] = Max(dp[i][j-1],dp[i+1][j]);
			}
		}
		printf("%d\n",dp[0][len-1]);
	}
	return 0;
}

           这个是n^2的时间复杂度,空间也是n^2的,还有一种空间优化的空间为n的复杂度,等以后遇到了再补吧。



全部评论

相关推荐

在笔试的大西瓜很矫健:校招数分不用想了,这经历和学历都不够用,大厂更别想,初筛都过不了,说点不好听的小厂数分都进不去(小厂也是假数分),要两个对口实习+3个项目(或者3+2),而且要有含金量才能补一点你的学历劣势。 建议刷实习,社招找数分,校招看运气,能入行业就行,可以运营转数分
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务