动态规划解决回文串问题
用dp数组来存储成为回文串所需要添加的最小字符数。
dp[i][j]代表i到j最少需要添加的数量。
状态转移
- 当a[i]=a[j]时,无需额外添加字符:
dp[i][j] = d[i+1][j-1] - 若不相等,则需要多添加一个:
考虑添加在i+1到j之间或者添加在i到j-1之间,
由于取最小值,则取二者较小的加一。
#include<bits/stdc++.h>
using namespace std;
int N, dp[101][101];
int main()
{
int T;
cin >> T;
for(int seq = 0; seq < T; seq++)
{
string a;
cin >> a;
int N = a.length();
memset(dp, 0, sizeof(dp));
for(int i = N-1; i >= 0; i--)
{
for(int j = i+1; j < N; j++)
{
if(a[i] == a[j])
dp[i][j] = dp[i+1][j-1];
else
dp[i][j] = min(dp[i+1][j],dp[i][j-1]) + 1;
}
}
cout << "Case " << seq+1 << ": " << dp[0][N-1] << endl;
}
return 0;
}