1. 程式人生 > >uva 11584 - 字符串 dp

uva 11584 - 字符串 dp

ostream printf ast car scan long queue adb pri

題目鏈接

一個長度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 */

uva 11584 - 字符串 dp