uva11584 Partitioning by Palindromes
题目大意:
给出一个字符串,把他划分成尽量少的回文串,问最少的回文串个数
/* 先预处理所有回文子串 dp[i]表示字符1~i划分成的最小回文串的个数 */ #include<iostream> #include<cstring> #include<cstdio> using namespace std; int t,dp[1010]; char s[1010]; bool p[1010][1010]; int main(){ //freopen("Cola.txt","r",stdin); scanf("%d",&t); while(t--){ scanf("%s",s+1); int len=strlen(s+1); memset(p,0,sizeof(p)); memset(dp,127/3,sizeof(dp)); for(int i=1;i<=len;i++){ int l=i,r=i; p[i][i]=1; while(l>1&&r<len){ l--;r++; if(s[l]==s[r]){ p[l][r]=p[r][l]=1; } else break; } l=i+1;r=i; while(l>1&&r<len){ l--;r++; if(s[l]==s[r]){ p[l][r]=p[r][l]=1; } else break; } } dp[0]=0;dp[1]=1; for(int i=1;i<=len;i++){ for(int j=0;j<i;j++){ if(p[j+1][i]){ dp[i]=min(dp[i],dp[j]+1); } } } printf("%d\n",dp[len]); } }