对于这种情况:
if(S[x] == S[y]) ret = solve(x+1,y-1,val+2 - (x==y));
它应该是:
if(S[x] == S[y]) ret = max(solve(x + 1, y - 1, val + 2 - (x==y)), max(solve(x + 1, y, 0),solve(x, y - 1, 0)));
因为,如果您无法创建从x到y的子字符串,则需要涵盖其他两种情况。
另一个错误:
if(ret!=0){ret = val + ret;return ret;}您不应该在这种情况下进行
return ret + val修改
ret。
主要问题是您将最终结果存储
val到中
dp[x][y],但这是不正确的。
例:
acabc,对于x = 1和y = 1,val = 3,所以
dp[1][1] = 3,但实际上应该是1。
固定:
int solve(int x,int y){ if(x>y)return 0; int &ret = dp[x][y]; if(ret!=0){return ret;} if(S[x] == S[y]){ ret = max(max(solve(x + 1, y),solve(x, y - 1))); int val = solve(x + 1, y - 1); if(val >= (y - 1) - (x + 1) + 1) ret = 2 - (x == y) + val; }else ret = max(solve(x+1,y),solve(x,y-1)); return ret;}


