1040 Longest Symmetric String 需再做
Posted CSU迦叶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1040 Longest Symmetric String 需再做相关的知识,希望对你有一定的参考价值。
解题思路
本题属于最长回文子串专题下。与之前的LIS和LCS的动规有两个较大的不同
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)