uva 11584

题目链接

一个长度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
",minDist[length-1]);
    }
    return 0;
}

/*
3
racecar
fastcar
aaadbccb
*/
原文地址:https://www.cnblogs.com/redips-l/p/7668366.html