标签:rac option mat aaa href ffffff vector dex ret
一个长度1000的字符串最少划分为几个回文字符串
-----------------------------------------------------------------------------------------------------------------
想复杂了。
首先N2的时间预处理一下,从i开始长度为len的字符串是否为回文串。
dist(i) = MIN(dist(i),dist(j)+1) 如果 j-i 为一个回文串
#include <set> #include <map> #include <stack> #include <queue> #include <cmath> #include <vector> #include <string> #include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> #define MAX(a,b) ((a)>=(b)?(a):(b)) #define MIN(a,b) ((a)<=(b)?(a):(b)) #define OO 0x0fffffff using namespace std; typedef long long LL; const int N = 1024; bool dp[N][N]; int minDist[N]; char str[N]; int main(){ int n; for(cin>>n;n--;){ scanf("%s",str); int length = strlen(str); for(int i=0;i<length;i++) minDist[i] = i+1; memset(dp,false,sizeof(dp)); for(int len=0;len<2;len++) for(int i=0;i<length;i++) { dp[len][i]=true; } for(int len=2;len<=length;len++){ for(int i=0;i<length;i++){ if(len+i>length) break; dp[len][i] = (str[i]==str[i+len-1])&&(dp[len-2][i+1]); } } for(int i=1;i<length;i++){ for(int j=0;j<=i;j++){ if(dp[i-j+1][j]) minDist[i] = MIN(minDist[i],j?(minDist[j-1]+1):1); } } printf("%d\n",minDist[length-1]); } return 0; } /* 3 racecar fastcar aaadbccb */
标签:rac option mat aaa href ffffff vector dex ret
原文地址:http://www.cnblogs.com/redips-l/p/7668366.html