区间DP大暴力吧?GG.
dp[ i ] 为字符至 i 的最少数量。
如果[Left , Right]是回文串,
dp[Right] = min(dp[ Right ] , dp[Left-1] + 1);
#include<bits/stdc++.h> using namespace std; const int N=5e3+10; int dp[N]; char a[N]; int n; int main(){ scanf("%s",a+1);n=strlen(a+1); for(int i=0;i<=n;i++) dp[i]=i; for(int i=1;i<=n;i++) { int Left,Right; //aba Left=Right=i; while(Left>=1&&Right<=n&&a[Left]==a[Right]) { dp[Right]=min(dp[Right],dp[Left-1]+1); Right++; Left--; } //abba Left=i;Right=i+1; while(Left>=1&&Right<=n&&a[Left]==a[Right]) { dp[Right]=min(dp[Right],dp[Left-1]+1); Right++; Left--; } // printf("%d\n",dp[i]); } printf("%d\n",dp[n]); return 0; }