solución recursiva de subcadena palindrómica más larga

Conozco soluciones que utilizan el enfoque de programación dinámica ascendente para resolver este problema en O (n ^ 2). Estoy buscando específicamente un enfoque dp de arriba hacia abajo. ¿Es posible lograr la subcadena palindrómica más larga usando una solución recursiva?

Esto es lo que he intentado pero falla en ciertos casos, pero siento que estoy casi en el camino correcto.

#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;
}