南陽理工 37《回文字串》 動態規劃

2021-08-19 02:29:10 字數 997 閱讀 7126

時間限制:

3000 ms  |  記憶體限制:

65535 kb

難度:4描述

所謂回文字串,就是乙個字串,從左到右讀和從右到左讀是完全一樣的,比如"aba"。當然,我們給你的問題不會再簡單到判斷乙個字串是不是回文字串。現在要求你,給你乙個字串,可在任意位置新增字元,最少再新增幾個字元,可以使這個字串成為回文字串。 輸入

第一行給出整數n(0

輸出每行輸出所需新增的最少字元數

樣例輸入

1

ab3bd

樣例輸出

2

**ioi 2000

解法:要求新增最少的字元,形成回文字串,那麼從左新增的數量和從右新增的數量應該是一致的,再者是回文,舉個例子abbbcb,如果是通過對比的話,那麼明顯就會多很多,a與b不一致,加2。。。顯然結果是不對的。

如何找到最小的操作呢,將字串反轉,bcbbba,將這兩個字串一對比,就明白了c與a是一定要加字元的,從而就將問題轉化為了求最大子串行。最大子串行也就是動態規劃的經典題目,先附上單調遞增最長子序列,思想都差不多。

在這個學習的過程中,學到了,scanf("%s",ch1+1);可以從字元陣列1開始計算,但是需要注意的一點是,strlen是求連續字串的長度,遇到空字元就停止,而且是從位址ch1開始計算,如果你不為ch1[0]賦值的話,那麼這個長度將是零。

原創**:

優化後的**:

#include#include#includeusing namespace std; 

char ch2[1005];

char ch1[1005];

int dp[1005][1005];

int main()

for(i=1;i}

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

} return 0;

}

南陽理工acm37 回文字串

時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 所謂回文字串,就是乙個字串,從左到右讀和從右到左讀是完全一樣的,比如 aba 當然,我們給你的問題不會再簡單到判斷乙個字串是不是回文字串。現在要求你,給你乙個字串,可在任意位置新增字元,最少再新增幾個字元,可以使這個字串成為回文...

nyoj 37 回文字串(動態規劃)

時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 所謂回文字串,就是乙個字串,從左到右讀和從右到左讀是完全一樣的,比如 aba 當然,我們給你的問題不會再簡單到判斷乙個字串是不是回文字串。現在要求你,給你乙個字串,可在任意位置新增字元,最少再新增幾個字元,可以使這個字串成為回文...

南陽理工學院動態規劃專題 回文字串

這個問題使用動態規劃求解,dp i j 表示字串下標為i的字元和下標為j的字元區間內構成回文所需加入的最少的字串。當str i str j 時,則dp i j dp i 1 j 1 當str i str j 時,dp i j min dp i 1 j 1,dp i j 1 1 初始化時候,d i i...