poj 8471 切割回文 dp 維度壓縮

2021-07-12 05:07:11 字數 1491 閱讀 8158

poj 8471 切割回文(dp+維度壓縮)

總時間限制: 1000ms 記憶體限制: 65536kb

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

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

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

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

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

接下來的 t 行,每一行都包含了乙個長度不超過的 1000 的字串,且字串只包含了小寫字母。

輸出 對於每組資料,輸出一行。該行包含乙個整數,表示阿福最少切割的次數,使得切割完得到的子串都是回文的。

樣例輸入

3

abaacca

abcd

abcba

樣例輸出

1 3 0

提示

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

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

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

從1000的資料規模可以知道這個題不是搜尋。

但是,由於我過於沉溺與記憶化搜尋/區間dp所以一上手直接給了乙個複雜度高的實現思想容易的o(

n3) 的dp,對區間[i,j]內的最小分割數dp,還企圖優化常數來騙過去。

但是痛定思痛,作為dp,只有低維不行加維度的,哪有一上手就來個高維度的。我並不需要知道[i,j]情況,只需要知道[1,j]情況,所以可以給乙個低維度的dp,只有o(

n2) 的複雜度。其實看到題解的一瞬間我就明白了這個方法,可惜我平時做題不過大腦,自己居然沒想到。希望通過這個題以後增加分析問題的能力,不要拘囿於思維定勢。

有了這些思路方程式十分簡單,不再列出來了。只貼了正確**。

accepted    1048kb  20ms    690 b   g++
#define max_len 1000

#include

#include

char s[max_len+1];

int cases,len;

bool f[max_len][max_len];

int dp[max_len];

inline

int min(int a,int b)

}printf("%d\n",dp[len-1]);

}return

0;}

OpenJudge P8471 切割回文

總時間限制 1000ms 記憶體限制 65536kb 描述 阿福最近對回文串產生了非常濃厚的興趣。如果乙個字串從左往右看和從右往左看完全相同的話,那麼就認為這個串是乙個回文串。例如,abcaacba 是乙個回文串,abcaaba 則不是乙個回文串。阿福現在強迫症發作,看到什麼字串都想要把它變成回文的...

openjudge 切割回文

描述 阿福最近對回文串產生了非常濃厚的興趣。如果乙個字串從左往右看和從右往左看完全相同的話,那麼就認為這個串是乙個回文串。例如,abcaacba 是乙個回文串,abcaaba 則不是乙個回文串。阿福現在強迫症發作,看到什麼字串都想要把它變成回文的。阿福可以通過切割字串,使得切割完之後得到的子串都是回...

openjudge 切割回文

總時間限制 1000ms 記憶體限制 65536kb 描述 阿福最近對回文串產生了非常濃厚的興趣。如果乙個字串從左往右看和從右往左看完全相同的話,那麼就認為這個串是乙個回文串。例如,abcaacba 是乙個回文串,abcaaba 則不是乙個回文串。阿福現在強迫症發作,看到什麼字串都想要把它變成回文的...