以最小插入次數構造回文串
比如輸入「s = abcea」 ,演算法返回2,因為可以給s插入2個字元變成回文串「abeceba」 或者「aebcbea」 。如果輸入s = 「aba」,則演算法返回0,因為s已經是回文串,不用插入任何字元。
base case:當i == j
時,dp[i][j] = 0
;因為當i == j 時 s[i...j]
就是乙個字元,本身就是回文串,所以不需要進行任何插入操作。
當s[i] != s[j]
時,插入兩次肯定可以讓s[i...j]
變成回文串,但是不一定是插入次數最少的。
則:做選擇,先將s[i...j-1]
或者s[i+1...j]
變成回文串
根據1的選擇,將s[i...j]
變成回文
//狀態轉移方程:
if(s[i]
== s[j]
)else
int
mininsertions
(string s)
else}}
//根據dp陣列的定義,題目要求的答案是dp[0][n - 1]
return dp[0]
[n -1]
;}
dp陣列的狀態之和和它相鄰的狀態相關,所以dp陣列是可以壓縮成一維的
/**
* 把二維壓縮成一維
*/intmininsertions_1
(string s)
else
pre = temp;}}
return dp[n -1]
;}
動態規劃 藍橋杯測試次數
題目描述 x星球的居民脾氣不太好,但好在他們生氣的時候唯一的異常舉動是 摔手機。各大廠商也就紛紛推出各種耐摔型手機。x星球的質監局規定了手機必須經過耐摔測試,並且評定出乙個耐摔指數來,之後才允許上市流通。x星球有很多高聳入雲的高塔,剛好可以用來做耐摔測試。塔的每一層高度都是一樣的,與地球上稍有不同的...
最小編輯代價(動態規劃)
在nowcoder上的題目,原題如下 對於兩個字串a和b,我們需要進行插入 刪除和修改操作將a串變為b串,定義c0,c1,c2分別為三種操作的代價,請設計乙個高效演算法,求出將a串變為b串所需要的最少代價。給定兩個字串a和b,及它們的長度和三種操作代價,請返回將a串變為b串所需要的最小代價。保證兩串...
最小編輯代價(動態規劃)
實現 對於不同的要求,主要是找到求dp i j 的規律。include include include include include include include using namespace std define max length 50 字串的最大長度 求出dp i j 代表從str1 ...