x星球的考古學家發現了一批古代留下來的密碼。
這些密碼是由a、b、c、d 四種植物的種子串成的序列。
仔細分析發現,這些密碼串當初應該是前後對稱的(也就是我們說的映象串)。
由於年代久遠,其中許多種子脫落了,因而可能會失去映象的特徵。
你的任務是:
給定乙個現在看到的密碼串,計算一下從當初的狀態,它要至少脫落多少個種子,才可能會變成現在的樣子。
輸入格式
共一行,包含乙個由大寫字母abcd構成的字串,表示現在看到的密碼串。
輸出格式
輸出乙個整數,表示至少脫落了多少個種子。
資料範圍
輸入字串長度不超過1000
輸入樣例1:
abcba
輸出樣例1:
0
輸入樣例2:
abdcdcbabc
輸出樣例2:
3
分析:對於這一題來說,是區間dp的型別,題目要求的是求是由於脫落了幾個密碼才由原來的回文密碼串變成現在的這樣的乙個密碼串,我們可以換位思考,你說我們能不能這樣思考,如果我們求的目前現在密碼串中的最大回文串的長度,然後再用總長度-最大回文長度=脫落了的密碼個數,如果還是有點不懂的話那我就舉乙個同學當時舉的例子:原來的男女都是成雙成對的,但是現在有1個女的3個男的求原來的情況,你說我們反向思考能不能把另外兩個男的斃了現在就只有一男一女還是剛好一對(雖然有點血腥但是就是這麼個意思),這樣我們就知道了原來是少了2個女生
由於我們取的是最大值而不是個數,所以我們就可以有交叉的關係,只要能取到最大值就行,像我們上圖中取l不取r就可以看作f(l,r-1)因為這包含了取l不取r的情況且範圍不超過我們整個的左右範圍。
我們在做區間dp的題目的時候最好先迴圈長度再去迴圈左右端點,因為我們有時候要用到+1的數,比如我們這一題就是(l,r)就是要用到(l+1,r),如果我們直接左右端點從前往後的後會出錯,我這就不舉例子了,大家可以自己試試。
區間dp問題一定要先列舉長度然後再去列舉左右端點!!!!
for
(int len =
1; len <= length; len++){
//列舉長度
for(
int l =
0; len + l -
1< length; l++){
int right = len + l -1;
//右端點
藍橋杯真題 密碼脫落 題解
題目 x星球的考古學家發現了一批古代留下來的密碼。這些密碼是由a b c d 四種植物的種子串成的序列。仔細分析發現,這些密碼串當初應該是前後對稱的 也就是我們說的映象串 由於年代久遠,其中許多種子脫落了,因而可能會失去映象的特徵。你的任務是 給定乙個現在看到的密碼串,計算一下從當初的狀態,它要至少...
密碼脫落 藍橋杯
密碼脫落 x星球的考古學家發現了一批古代留下來的密碼。這些密碼是由a b c d 四種植物的種子串成的序列。仔細分析發現,這些密碼串當初應該是前後對稱的 也就是我們說的映象串 由於年代久遠,其中許多種子脫落了,因而可能會失去映象的特徵。你的任務是 給定乙個現在看到的密碼串,計算一下從當初的狀態,它要...
藍橋杯 密碼脫落
注意 main函式需要返回0 注意 只使用ansi c ansi c 標準,不要呼叫依賴於編譯環境或作業系統的特殊函式。注意 所有依賴的函式必須明確地在原始檔中 include 不能通過工程設定而省略常用標頭檔案。include define max 1000 using namespace std...