题意是找最长对称子序列,我的算法先将子序列翻转,然后找最长公共连续子序列,同样是用动态规划,和LCS不同的是状态函数
#include<iostream>
#include<string.h>
using std::cin;
using std::cout;
using std::endl;
char str[1010],rstr[1010];
int m[1010][1010];
int max(int a, int b){
return a > b ? a : b;
}
int LongestSym(char str[],char rstr[]){
int length = strlen(str);
int maxlen = 0, i, j, flag = 0,len = 0;
for (i = 0; i < length; i++)
{
m[0][i] = 0;
m[i][0] = 0;
}
for (i = 1; i <= length; i++)
for (j = 1; j <= length; j++)
{
if (str[i - 1] == rstr[j - 1])
m[i][j] = m[i - 1][j - 1] + 1;
else m[i][j] = 0;
if (m[i][j]>maxlen)
maxlen = m[i][j];
}
return maxlen;
}
void reverse(char str[]){
int len = strlen(str);
int i, j;
for (i = 0, j = len - 1; j >= 0; j--, i++)
rstr[i] = str[j];
rstr[i] = '\0';
}
int main(){
freopen("1.in", "r", stdin);
cin.get(str,1009);
reverse(str);
int longest = LongestSym(str,rstr);
cout << longest << endl;
return 0;
}