题目:
扫描回文串的每个中心,寻找他的回文串,用DP来记录更新;
状态方程dp[j]=min(dp[j],dp[k-1]+1);
看前面一段用最优的,后面一段是回文+1。
代码:
//状态方程dp[j]=min(dp[j],dp[k-1]+1);
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=5010;
const int inf=0x3f3f3f3f;
char a[MAXN];
int dp[MAXN];
int main()
{
int i,j,k,n;
cin>>a+1;
n=strlen(a+1);
//初始化,比较最小
for(i=1;i<=n;i++)
{
dp[i]=inf;
}
//i控制从中心开始,判断是否是回文;
for(i=1;i<=n;i++)
{
for(j=i,k=i;j<=n&&k>0;j++,k--)
{
//j从自身开始判断再往后,k往前确定字符;回文为奇数时
if(a[j]==a[k])
dp[j]=min(dp[j],dp[k-1]+1);
else
break;
}
for(j=i+1,k=i;j<=n&&k>0;j++,k--)
{
//j从自身后一位开始判断再往后;回文为偶数时
if(a[j]==a[k])
dp[j]=min(dp[j],dp[k-1]+1);
else
break;
}
}
cout<<dp[n]<<endl;
return 0;
}