动态规划:
最长回文子串:连续+回文
公式
p[i,j] =
1)if(str[i] == str[j]) p[i][j] = 2+p[i+1][j-1]
2)if(str[i]!=str[j]) p[i][j] = max(p[i][j-1], p[i+1][j])
p[i][i] = 1;
需要注意的是,在求解的时候
计算的长度由短到长,否则在公式中依赖较短的长度的值不可得会造成错误。
//最长回文子串
int finddp1(string str)
{
int len = str.size();
vector<vector<int> > dp1(len, vector<int>(len,0));
for(int i = 0; i < len; i++)
{
dp1[i][i] = 1;
}
for(int i = 1; i < len; i++) //串长度
{
for(int j = 0; j+i < len; j++) //串的起始和结束下标
{
if(str[j] == str[j+i])
{
dp1[j][j+i] = 2 + dp1[j+1][j+i-1];
}
else
{
dp1[j][j+i] = max(dp1[j][j+i-1], dp1[j+1][j+i]);
}
}
}
return dp1[0][len-1];
}
int main()
{
string input;
cin>>input;
printf("%d\n",finddp1(input));
return 0;
}