題目描述
給乙個字串, 要求把它分割成若干個子串,使得每個子串都是回文串。問最少可以分割成多少個。 字串長度不超過1000。
例如:
「racecar」本身就是回文串,答案為1
「fastcar」,答案為7,分成的7個回文串為"f", "a", "s", "t", "c", "a", "r"
「aaadbccb」,答案為3,分成的3個回文串為"aaa", "d", "bccb"
輸入第一行乙個數t。接下來t行,每行乙個字串。
輸出對於每個字串輸出答案。
樣例輸入
racecar
fastcar
aaadbccb
樣例輸出
題解dp[i] 為字串中 1~i 劃分成最少回文串的個數。則:
dp[ i ]=min( dp[ j ] + 1 ) 其中,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;
}
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...
uva 11584 劃分回文串
線性dp問題 設d i 代表a 0 i 字元構成的串中劃分成回文串的最小個數 則有狀態轉移方程 d i min 可以這麼理解方程 d i 表示 0 i 範圍的最優方案,由最優子結構性質,d i 的表示也是由幾個最優項組成 d j 1.include using namespace std defin...