本文转载自: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( }
转载于:https://blog.51cto.com/13646851/2087560