Uva 11584,劃分成回文串

2022-04-01 07:47:56 字數 694 閱讀 7565

題意:乙個字串,將它劃分一下,使得每個串都是回文串,求最少的回文串個數。

分析:d(i)到第 i 個字元時的最優解(即最少劃分為幾個回文串),就有方程  d(i) = min(d(j)) + 1;(其中s[j+1,i]要是回文串)。

這樣一來,列舉就是o(n^2)的複雜度,如果按照普通的判斷s[j+1,i]是否是回文串,時間複雜度為o(n^3);先用o(n^2)的複雜度預處理is_huiwen[i][j]判斷是否是回文串。前面我採用的dp的方案。這裡學了乙個更好寫的方案,——中心擴充套件法。

這裡值得注意的是:  預留乙個dp[0] = 0;這樣在當前面沒有回文串時,而整個字串是回文串的時候,就有d[i] = d[0]+1 =1;

#include using

namespace

std;

const

int maxn = 1000+5

;int

n,kase,p[maxn][maxn],d[maxn];

bool

vis[maxn][maxn];

char

s[maxn];

int is_palindrome(int i, int

j)int

main()

}printf(

"%d\n

",d[n]);

}return0;

}

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...

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...