题目:题目详情 - 7-13 最长回文子序列 (25 分) (pintia.cn)
题解:
这题我用了动态规划,两层循环,第一层循环代表的是向后移动判断的位数,第二层循环代表的是开始移动时的位置。
每一次i改变后,字符串都是从最开始的那个字符开始判断。
(1)下图是j为0,i为1时的情况,
此时,两个字符不相等,就要取最长的,最长的可能是取左边的字符,也可能是取右边的字符,有两种可能。
else if(s[i+j]!=s[j])
{
temp=max(d[j+1][j+i],d[j][j+i-1]);//不对称的时候取最长的
d[j][j+i]=temp;
}
(2)这种情况就是两个字符相等时,就是在以前的长度下加2
if(s[i+j]==s[j])//对称时长度加2
temp=d[j+1][j+i-1]+2;
代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
char s[10000];
cin>>s;
int d[1000][1000],temp;
for(int i=0;i<strlen(s);i++)
d[i][i]=1;
int n=strlen(s);
for(int i=1;i<n;i++)
{
for(int j=0;j+i<n;j++)
{
if(s[i+j]==s[j])//对称时长度加2
temp=d[j+1][j+i-1]+2;
else
temp=max(d[j+1][j+i],d[j][j+i-1]);//不对称的时候取最长的
d[j][j+i]=temp;
}
}
cout<<d[0][strlen(s)-1];
return 0;
}