切割回文串(動歸練習)

2021-08-27 23:39:30 字數 700 閱讀 2545

題目大意:有n個字串,每個字串包含回文子串(單個字元也算回文子串),問對每乙個字串,最少切割多少次才能使子串都是回文串?例如asddsafg可以切割為:asddsa,f,g

解題思路:顯然,如果乙個字串本身就是回文串,切割次數為0,但是對於似乎沒規律的字串如何?

首先,我們需要乙個函式判斷一段字串是不是回文串,因為沒有特殊的規律,所以需要比較繁瑣的判斷過程,即把乙個字串從頭到尾都判斷一遍。然後就是動態規劃的表示式了

假設從乙個字串的j到i是回文串,判斷是不是要割,用乙個陣列f【】表示到某乙個位置要切割的最小次數,顯然f[0]=0,將其他的f設為比較大的值,因為後續要求的是最小值。如果在i處切,f[i]不切的話選擇不變,或者切的話是f[j-1]+1,取最小值即可。

**:

#include#include#include#includeusing namespace std;

int f[1001] = {};//f[i]表示前i個需要分割多少次

int len;

char s[1001] = {};

bool ishui(int x, int y)

}return true;}//判斷是不是回文串

int main()

else}}

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

return 0;

}

openjudge 切割回文

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

openjudge 切割回文

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

OpenJudge P8471 切割回文

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