给一个字符串,划分成最少的回文串
如aaadbccb ----> aa d bccb
f[i] = miin{ f[j]+1 } j<i, 且 s[j...i]是回文串
#include <iostream> #include <cstring> using namespace std ; const int N=1000; char s[N]; int p[N][N],f[N],vis[N][N],n; int test(int a,int b){ if(a>=b) return 1; if(s[a]!=s[b]) return 0; if(vis[a][b]) return p[a][b]; vis[a][b]=1; return p[a][b]=test(a+1,b-1); } void dp(){ int i,j; for(i=1;i<=n;i++) f[i]=i+1; for(i=1;i<=n;i++) for(j=0;j<i;j++) if(test(j+1,i)) f[i]=min(f[i],f[j]+1); } int main(){ int T; cin>>T; while(T--){ scanf("%s",s+1); n=strlen(s+1); memset(vis,0,sizeof vis); dp(); printf("%d\n",f[n]); } }
标签:return,int,vis,11584,test,uva From: https://www.cnblogs.com/towboa/p/16834417.html