劃分成回文串

2022-08-22 01:24:14 字數 1111 閱讀 4931

題目大意: 給乙個字串, 要求把它分割成若干個子串,使得每個子串都是回文串。問最少可以分割成多少個。 字串長度不超過1000。

例如: 

「racecar」本身就是回文串,答案為1 

「fastcar」,答案為7,分成的7個回文串為"f", "a", "s", "t", "c", "a", "r" 

「aaadbccb」,答案為3,分成的3個回文串為"aaa", "d", "bccb"

樣例輸入1:

racecar

樣例輸入2:

fastcar

樣例輸入3:

aaadbccb

樣例輸出

樣例輸出1:

1樣例輸出2:

7樣例輸出3:

3dp[i] 為字串中 1~i 劃分成最少回文串的個數。則:

dp[ i ]=min   其中,s[ j+1 -> i ] 為回文串

但是如果每次判斷 s[ j+1 -> i ] 是否為回文串,那麼時間複雜度為o(n3),顯然不夠優秀。

所以,應先o(n2)預處理出所有s[ i -> j ]是否為回文串(分長度為奇數和長度為偶數)。

總複雜度:o(n2)

#include#include

#include

#include

#include

#include

using

namespace

std;

#define ll long long

const

int maxn=1000+10

;char

a[maxn];

intdp[maxn],l,lef,rig;

bool

p[maxn][maxn];

template

void read(t&aa)

intmain()

}for(int i=1;i)

}dp[

1]=1;dp[0]=0

;

for(int i=2;i<=l;i++)

for(int j=0;j)

cout

return0;

}

view code

Uva 11584,劃分成回文串

題意 乙個字串,將它劃分一下,使得每個串都是回文串,求最少的回文串個數。分析 d i 到第 i 個字元時的最優解 即最少劃分為幾個回文串 就有方程 d i min d j 1 其中s j 1,i 要是回文串 這樣一來,列舉就是o n 2 的複雜度,如果按照普通的判斷s j 1,i 是否是回文串,時間...

UVA11584 劃分成回文串

紫書275 題意 輸入乙個字元,最少能劃分幾個回文串 分析 預處理一下,判斷i,j是否為回文串 動態分析求解,dp i dp i 1 1,假設i單獨成為乙個回文串,然後在往前找,如果j到i是回文,dp i min dp i dp j 1 1 1 include 2 include 3 include...

UVa11584 劃分成回文串

題目描述 給乙個字串,要求把它分割成若干個子串,使得每個子串都是回文串。問最少可以分割成多少個。字串長度不超過1000。例如 racecar 本身就是回文串,答案為1 fastcar 答案為7,分成的7個回文串為 f a s t c a r aaadbccb 答案為3,分成的3個回文串為 aaa d...