我知道使用自下而上动态编程方法的解决方案在O(n ^ 2)中解决这个问题 . 我特意寻找自上而下的dp方法 . 是否有可能使用递归解决方案实现最长的回文子串?
这是我尝试的但是在某些情况下它失败了,但我觉得我几乎走在正确的轨道上 .
#include <iostream>
#include <string>
using namespace std;
string S;
int dp[55][55];
int solve(int x,int y,int val)
{
if(x>y)return val;
int &ret = dp[x][y];
if(ret!=0){ret = val + ret;return ret;}
//cout<<"x: "<<x<<" y: "<<y<<" val: "<<val<<endl;
if(S[x] == S[y])
ret = solve(x+1,y-1,val+2 - (x==y));
else
ret = max(solve(x+1,y,0),solve(x,y-1,0));
return ret;
}
int main()
{
cin >> S;
memset(dp,0,sizeof(dp));
int num = solve(0,S.size()-1,0);
cout<<num<<endl;
}
2 回答
对于这种情况:
它应该是:
因为,如果您无法从x到y创建子字符串,则需要涵盖其他两种情况 .
另一个错误:
你应该
return ret + val
而不是在这种情况下修改ret
.主要问题是您将最终
val
存储到dp[x][y]
中,但这不正确 .例:
acabc,对于x = 1和y = 1,val = 3,所以
dp[1][1] = 3
,但实际上,它应该是1 .固定: