题目大意
给定一个小写字母组成的字符串S,你的任务是划分成尽量少的回文串
题解
方程就是dp[j]=min(dp[i-1]+1)(i<=j,s[i..j]是回文串)
代码:
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> using namespace std; #define MAXN 1005 char s[MAXN]; int dp[MAXN]; bool check(int l,int r) { int len=(l+r)/2; for(int i=l; i<=len; i++) if(s[i]!=s[r-i+l]) return false; return true; } int main() { int n; scanf("%d",&n); while(n--) { scanf("%s",s+1); int len=strlen(s+1); for(int i=1; i<=len+1; i++) dp[i]=1005; dp[0]=0; for(int i=1; i<=len; i++) { for(int j=1; j<=i; j++) if(check(j,i)) dp[i]=min(dp[i],dp[j-1]+1); } printf("%d ",dp[len]); } return 0; }