usaco beads 再一次對DP的了解

2021-04-21 08:28:45 字數 917 閱讀 9838

剛做這個題目的時候,我不是用dp來做的,雖然效率還不錯,但是寫得很

亂。後來看了一下解題報告,看到了別人非常漂亮的用dp把它弄出來了,就想學

習一下動態規劃的演算法。這個題目是這樣的,有一串項鍊,上面有三種顏色的珠

子,紅,藍,白,其中白色可以看作是與紅色或藍色同種顏色,如果在項鍊的某

一點處斷開,那麼在這一點處可以分別向左或向右收集到同種顏色的珠子,問從

哪一點處斷開可以收集到最多的珠子數。並列印出最多的珠子的個數。

測試資料如下:

input 29

wwwbbrwrbrbrrbrbrwrwwrbwrwrrb

output

11在輸入中w代表白色,b代表藍色,r代表紅色。收集到的11顆珠子為

wrwrrbwwwbb,是在第28和第29顆珠子中間斷開。

這個題目用動態規劃來解非常合適,動態規劃的思想是:儲存比較優的子解

然後用這些子解來構成最終的最優解。若要求在p點處斷開能收集到的最多的

珠子,假設用max[p]來儲存,則它是由從左邊收集到的最多的珠子數和從右邊

收集到的最多的珠子數組成的。而它所收集到的珠子可能是紅色,也可能是藍

色,分別用r[p],b[p]來儲存,則對於左邊而言。

r[0] = b[0] = 0;

if(c == 'r')

then r[p] = r[p-1]+1;

b[p] = 0;

if(c == 'b')

then b[p] = b[p-1]+1;

r[p] = 0;

if(c == 'w')

then r[p] = r[p-1]+1;

b[p] = b[p-1]+1;

對於右邊則一樣。只不過得從陣列的未尾開始算即r[n] = b[n] = 0;

再一次求助

編24點程式時遇到的問題 大佬好呀,python小白又來求助啦!這次的問題是在編24點時遇到的乙個問題 如何將使用者輸入的數字運算出結果?源 import random shuzi str one str random.randint 1,10 shuzi str two str random.ra...

再一次,明道雲

致各位老明道使用者,我說的老明道使用者,指的是2012年到2017年這五年中曾經使用過明道協作平台,然後因為種種原因停止使用的客戶。根據我們的記錄,總計大約有5000家企業。5000家付費客戶的流失,對於我們來說,是痛徹心扉的事情。只不過它發生在漫長的五年之中,所以更像小刀剮肉。從2018年開始,明...

再一次來到廣東

兩年前 來過廣東幾個地方 呆過一段時間 但是沒什麼印象 第一是沒有認識的人 第二是 沒有什麼讓我印象深刻的事 所以 大腦中也就沒怎麼裝這些沒多大用處的東西 再一次來到廣東 心情真的無法形容 雖然還沒有來 就感覺自己對這邊已經很熟了 因為現在不同 現在很多朋友都在這邊 大多數都是素未謀面 但卻感覺異常...