四时宝库

程序员的知识宝库

动态规划-最长回文子序列 C++解答

最长回文子序列是我们上机考都应该学会的题型,意思大概是:给定一个字符串,我们要找到顺着读和反着读一样的最长序列,比如ABAC,这个最长序列就是ABA。

下面小编就给大家介绍一个DP算法:

DP

我们对于字符串S,定义一个dp[][]二维数组,dp[i][j] = 1表示S[i.....j]是回文子串。那么,对于它的子串S[i+1.....j-1]也就肯定是回文子串了。

另外,dp[i][i]也肯定算一个回文子串。

算法大概就是如此,理解也很容易。

好了,废话不多说,直接上代码,代码里面有注释,大家直接看就行。

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn = 1010;
char S[maxn];//定义字符数组 
int dp[maxn][maxn];
int main()
{
	gets(S);//输入字符数组 
	int len = strlen(S), ans = 1;
	memset(dp, 0, sizeof(dp));//dp数组初始化 为0
	//边界
	for(int i = 0; i < len; i++)
	{
		dp[i][i] = 1;
		if(i < len - 1)
		{
			if(S[i] == S[i + 1])//判断相邻两个字符是否相等 
			{
				dp[i][i+1] = 1;
				ans = 2;//初始化时注意当前最长回文子串的长度 
			}
		}
	} 
	
	//状态转移方程
	for(int L = 3; L <= len; L++)
	{
		for(int i = 0; i + L - 1 < len; i++)
		{
			//i是字符串的左端点,j是字符串的右端点 
			int j = i + L - 1;//子串的右端点
			if(S[i] == S[j] && dp[i + 1][j - 1] == 1)
			{
				dp[i][j] = 1;
				ans = L;//更新最长回文子串长度 
			} 
		}
	} 
	
	cout << ans;
	system("pause");
	return 0;
}

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接