OpenJudge8471 劃分DP 切割回文

2022-06-02 16:03:14 字數 1234 閱讀 1741

阿福最近對回文串產生了非常濃厚的興趣。

如果乙個字串從左往右看和從右往左看完全相同的話,那麼就認為這個串是乙個回文串。例如,「abcaacba」是乙個回文串,「abcaaba」則不是乙個回文串。

阿福現在強迫症發作,看到什麼字串都想要把它變成回文的。阿福可以通過切割字串,使得切割完之後得到的子串都是回文的。

現在阿福想知道他最少切割多少次就可以達到目的。例如,對於字串「abaacca」,最少切割一次,就可以得到「aba」和「acca」這兩個回文子串。

輸入輸入的第一行是乙個整數 t (t <= 20) ,表示一共有 t 組資料。

接下來的 t 行,每一行都包含了乙個長度不超過的 1000 的字串,且字串只包含了小寫字母。輸出對於每組資料,輸出一行。該行包含乙個整數,表示阿福最少切割的次數,使得切割完得到的子串都是回文的。

3

abaacca

abcd

abcba

1

30

對於第一組樣例,阿福最少切割 1 次,將原串切割為「aba」和「acca」兩個回文子串。

對於第二組樣例,阿福最少切割 3 次,將原串切割為「a」、「b」、「c」、「d」這四個回文子串。

對於第三組樣例,阿福不需要切割,原串本身就是乙個回文串。

這道題思路很像山區建小學,列舉切割的斷點進行dp即可。

轉移方程為:dp[i]=min(dp[i],dp[j]+1),dp[i]表示前i個字元最少需要切幾次,dp[j]+1為這次如果切的話到i的切割次數。

ac**:

1 #include 2 #include 3 #include 4

using

namespace

std;

5int

t,lenn;

6int dp[1010];7

char ch[1010];8

bool pldr[1010][1010];9

intmain()

21for(int j=1;j<=lenn;++j)

22for(int k=1;k<=j;++k)

23if(pldr[k][j]) dp[j]=min(dp[j],dp[k-1]+1

);24 printf("

%d\n

",dp[lenn]-1

); 25}

26return0;

27 }

1 2 劃分核心

1.2.劃分核心 第 1 章 第一章 裝置驅動簡介 在 unix 系統中,幾個併發的程序專注於不同的任務.每個程序請求系統資源,象計算能力,記憶體,網路連線,或者一些別的資源.核心是個大塊的可執行檔案,負責處理所有這樣的請求.儘管不同核心任務間的區別常常不是能清楚劃分,核心的角色可以劃分 如同圖核心...

2劃分的實現

1.定義 2劃分,是指多個事物作為乙個集合s,把集合s的事物分成兩部分。而這樣的不同劃分有多少個,即為2劃分數。例如,s 則2劃分有 a b,c b a,c c a,b 2劃分數為3.2.演算法實現 假設s的大小為n,即有n個元素。那麼相對於s的不同劃分有 2的 n 1 次方 減 1 個。所以,用乙...

23 劃分字母區間

題目描述 字串 s 由小寫字母組成。我們要把這個字串劃分為盡可能多的片段,同乙個字母只會出現在其中的乙個片段。返回乙個表示每個字串片段的長度的列表。示例 1 輸入 s ababcbacadefegdehijhklij 輸出 9,7,8 解釋 劃分結果為 ababcbaca defegde hijhk...