1040 Longest Symmetric String 需再做

Posted CSU迦叶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1040 Longest Symmetric String 需再做相关的知识,希望对你有一定的参考价值。

解题思路

本题属于最长回文子串专题下。与之前的LISLCS的动规有两个较大的不同

1. 虽然最后也是要求长度,但是长度信息不再蕴含在dp数组当中,dp[i][j]表示的仅仅是从s[i]起s[j]止这一段是否是回文,所以为了提醒自己,我设置成了布尔型。

bool dp[maxn][maxn] = {0};

2. 动规方程是不难想到的,根据s[i],s[j]是否相同,以及dp[i+1][j-1]是否为1来判断dp[i][j]的值。但是这样从两边向中间逼近的方式,会出现的问题是:中间可能自己还不知道答案呢。。总之用之前的二重循环肯定是完成不了

参考书上给出的思路是,先把所有长度为1和2的dp都给初始化(状态边界)

for(int i=0;i<len;i++){
	dp[i][i] = 1;//长度为1,一定是
	if(i<len-1){
		if(s[i]==s[i+1]){
			dp[i][i+1] = 1;
			ans = 2;//更新最长字串长度 
		}
	} 
}

 然后从长度3开始进行状态转移,至于长度的记录,外包给另一个int型变量ans即可

//从长度为3的子串开始进行状态转移
for(int L=3;L<=len;L++){
	for(int l=0;l+L-1<len;l++){
		int r = l+L-1;
		if(s[l]==s[r]&&dp[l+1][r-1]){
			dp[l][r] = 1;
			ans = L;
		}
	}
} 

AC代码

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<bits/stdc++.h>
using namespace std;

const int INF = 1000000000;//10的9次方 
const int maxn = 1010;
const double eps = 1e-3;

bool dp[maxn][maxn] = {0};//dp[i][j]表示以第i个字符开头、第j个字符结尾的子串是不是回文滴 

int main(){
	
	string s;
	int ans = 1;//已知非空且单独一个字符属于回文 
	
	getline(cin,s);
	
	int len = s.length();
	
	//状态边界是长度为1和2的字符串 
	for(int i=0;i<len;i++){
		dp[i][i] = 1;//长度为1,一定是
		if(i<len-1){
			if(s[i]==s[i+1]){
				dp[i][i+1] = 1;
				ans = 2;//更新最长字串长度 
			}
		} 
	}
	
	//从长度为3的子串开始进行状态转移
	for(int L=3;L<=len;L++){
		for(int l=0;l+L-1<len;l++){
			int r = l+L-1;
			if(s[l]==s[r]&&dp[l+1][r-1]){
				dp[l][r] = 1;
				ans = L;
			}
		}
	} 
	
		
	
	printf("%d\\n",ans);
	
	return 0; 
}

以上是关于1040 Longest Symmetric String 需再做的主要内容,如果未能解决你的问题,请参考以下文章

PAT1040:Longest Symmetric String

1040. Longest Symmetric String (25)

1040. Longest Symmetric String (25)

1040. Longest Symmetric String (25)

1040 Longest Symmetric String (25分)

1040 Longest Symmetric String (25分)