題目的意思就是給你乙個字串,問你最少經過幾次操作,能把它變成回文字串.
操作有三種
1.在任意位置新增乙個字元.
2.在任意位置刪除乙個字元;
3.替換掉任意乙個字元;
首先我們的d[i][j]是指,將i到j之間的這個串變成回文最少要幾步.
我們可以發現d[i][j]如果第i個字元,和第j個字元,是相同的.難麼d[i][j] = d[i + 1][j - 1]也就是不管這兩個相同的,往裡面縮一位.
但是如果第i位和第j位不相同,那麼我們就要比較了.
如果這兩位不相同,我們有兩種辦法,
1.把左邊那位刪了,或者把右邊那位刪了(因為通過加上兩位讓他們邊回文,開銷肯定大,所以我們直接不考慮加.)axxxb ->xxxb
2.把左邊那位變成右邊那位,或者把右邊那位,變成左邊那位 axxxb ->bxxxb;
上面兩種辦法開銷都是1次 ,我們我們比較 min ( d[i + 1][ j ] , d[ i ] [ j - 1] , d[ i + 1 ][ j - 1] ) + 1;
最後如果 j - i < 1了,就返回0 ,因為只有1位了肯定是回文了呀,不需要操作...
ac**:
#include#includeconst int n = 1005;
const int inf = 0x3f3f3f3f;
char str[n];
int d[n][n];
int dp(int l , int r)
else if(str[l] == str[r])
else
d[l][r] = m;
return m;
}int main ()
}
回文字串(DP)
時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述所謂回文字串,就是乙個字串,從左到右讀和從右到左讀是完全一樣的,比如 aba 當然,我們給你的問題不會再簡單到判斷乙個字串是不是回文字串。現在要求你,給你乙個字串,可在任意位置新增字元,最少再新增幾個字元,可以使這個字串成為回文字...
回文字串(DP)
時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述所謂回文字串,就是乙個字串,從左到右讀和從右到左讀是完全一樣的,比如 aba 當然,我們給你的問題不會再簡單到判斷乙個字串是不是回文字串。現在要求你,給你乙個字串,可在任意位置新增字元,最少再新增幾個字元,可以使這個字串成為回文字...
DP入門 回文字串
題目來自nyist第37題,如下 描述 所謂回文字串,就是乙個字串,從左到右讀和從右到左讀是完全一樣的,比如 aba 當然,我們給你的問題不會再簡單到判斷乙個字串是不是回文字串。現在要求你,給你乙個字串,可在任意位置新增字元,最少再新增幾個字元,可以使這個字串成為回文字串。輸入第一行給出整數n 0每...