本文转载自:http://www.javaxxz.com/thread-359302-1-1.html

题意:

输入一个由小写字母组成的字符串(长度不超过1000),你的任务是把它划分成尽量少的回文串。
例如,racecar本身就是回文串;fastcar只能分成7个单字母的回文串,aaadbccb最少分成3个回文串:aaa, d, bccb。

 

分析:

设d[i]为字符0~i划分成的最小回文串的个数,则d[i] = min{d[j] + 1 | s[j+1~i]是回文串}。
可以先用O(n*n)时间预处理s[i..j]是否为回文串。方法是枚举中心,然后不断向左右延伸,直到左右字符不同为止。

 

代码:

 #include <cstdio>
 #include <cstring>
 #include <algorithm>
   
   UP =  +   d[UP]; 
   isp[UP][UP]; 
 
  init(* s,      memset(isp, ,      ( t = ; t <= len; t++         ( f = t, b = t;  <= f && b <= len; f--, b++             (s[f] == s[b]) isp[f][b] =                         ( f = t, b = t + ;  <= f && b <= len; f--, b++             (s[f] == s[b]) isp[f][b] =                   
           scanf(, &     (T--         scanf(, s +          init(s, len = strlen(s +          ( t = ; t <= len; t++             d[t] =             ( i = ; i <= t; i++                 (isp[i][t]) d[t] = min(d[t], d[i-] +           printf(        }