题意:求在一个字符串中插入最少多少个字符可以使得这个字符串变成一个回文串。
以前用LCS的解法做过,这次是找出了子结构,然后用动态规划做的。
dp[i][j]表示第i个到第j个字符需要插入dp[i][j]个字符能形成回文串,答案就在dp[0][n-1]里,dp数组直接初始化为0就可以了。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
short int dp[5001][5001];
int main()
{
int n,i,j,t;
char str[5001];
scanf("%d",&n);
getchar();
scanf("%s",str);
memset(dp,0,sizeof(dp));
for (i=n-1; i>=0 ;i--)
{
for (j=i+1; j<n; j++)
{
if (str[i] == str[j])
{
dp[i][j]=dp[i+1][j-1];
}
else
{
dp[i][j]=(dp[i+1][j]>dp[i][j-1]?dp[i][j-1]:dp[i+1][j])+1;
}
}
}
printf("%d\n",dp[0][n-1]);
}