假设我有一个单词“SALADS”。我必须找出我可以从这个单词中删除字母的方式,以便它成为一个回文。由于删除字母的顺序而有所不同的两种方式被认为是相同的。 “SALADS”的答案是15。
我用递归DP解决了这个问题。
string S;
int DP[65][65];
int DFS(int l, int r)
{
if(l==r) return 1;
if(l>r) return 0;
if(DP[l][r]!=-1) return DP[l][r];
DP[l][r]=0;
if(S[l]==S[r])
{
return DP[l][r] = 1 + DFS(l+1, r) + DFS(l, r-1);
}
else
{
return DP[l][r] = DFS(l+1, r) + DFS(l, r-1) - DFS(l+1, r-1);
}
}
int main()
{
S = "SALADS";
DFS(0, S.size()-1);
}
如何使用迭代DP解决此问题?
答案 0 :(得分:1)
试试这个 - >
可能会有效:
long long dp[MAX][MAX];
long long solve(string str)
{
int n = str.size();
int i, j;
memset(dp,0,sizeof(dp));
for(i=n; i>0; i--)
for(j=i; j<=n; j++)
dp[i][j]=(str[i-1]==str[j-1] ? 1+dp[i+1][j]+dp[i][j-1] : dp[i+1][j]+dp[i][j-1]-dp[i+1][j-1]);
return dp[1][n];
}