dp[i]=max+1
a[i]=a[j] dp[i][j]=dp[i-1][j-1]+1
否則 dp[i][j]=max(dp[i-1][j],dp[i][j-1])
比較蛋疼的語文題……
如果語文比較好幾乎是裸lis…雖說大概需要糾結一下常係數
dp[i]=min(dp[j]+1|s[j+1~i]為回文串)
並不太明顯的lis,不過不妨思考一下。
[lis的實質是什麼?我認為並非簡簡單單的不下降子串行。
lis是這樣一種模型:首先我們不需要用區間的方式去思考,即區間開始的位置不會對求解造成影響。其次,後乙個狀態與前乙個狀態的轉移,不僅僅建立在前乙個狀態,還可能與之前某些狀態有關。
可能你會認為這違反了最優子結構性質,其實不然。對於lis模型來說,dp[i]始終是最優的,而前面所有狀態保持其最優性並產生新的最優結構。
這裡的回文串就是如此。首先,這裡的區間開始位置不會對結果造成影響,而所有條件的構建,基於之前某些狀態。詳細的說,如果j+1到i是回文串,顯然此時回文串數會在原串數基礎上+1。
] 由於判斷是o(n)的,所以複雜度o(n3
)。生命無法承受之慢。
於是直觀的我們想到能否預處理回文串。劉書上講的列舉終點,不過我在網上看到了這種更好的:
用flag[i][j]表示從i開始的長度為j的串是否為回文串。
flag[i][1]必定為回文串,而如果a[i]=a[i+1]那麼flag[i][2]也是回文串。
接下來的是精髓:
for(int j=3;j<=l;++j)//長度
for(int i=1;i<=a.size();++i)//起始點
if(flag[i+1][j-2]&&a[i]==a[i+j-1])
a[i][j]=1;
我們類似遞推的推導:flag[i][j]為真當且僅當從i+1出發長度為j-2的串為回文串,且a[i]=a[i+j-1],這樣就可以在o(n2
)預處理,總複雜度o(n2
)題意說的有些迷…說白了就是每次能從兩個棧中取出棧頂的乙個元素。
i表示第乙個陣列的第i個元素,j為第二個的第j個
假定用l(c)表示c顏色的跨度,在滿足條件的情況下,每次轉移l(c)都應當+1.
現在用c[i][j]表示此時有多少是進入但未出的,於是
若i=0,c[i][j]=c[i][j-1],若有乙個元素剛進入且還有則+1,若有乙個元素剛出去則-1.
對j=0同理。
因此我們可以列出這樣乙個轉移方程:
dp[i][j]表示在第乙個串列舉到第i個、第二個串列舉到第j個的時候還需要多少費用。
那麼若j>0,dp[i][j]=min(dp[i][j],dp[i][j-1]+c[i][j-1])
若i>0,dp[i][j]=min(dp[i][j],dp[i-1][j]+c[i-1][j])
《演算法與資料結構》學習筆記4 鍊錶(上)
本次分兩篇來記錄鍊錶的內容。與陣列相比,鍊錶是一種稍微複雜一點的資料結構。這兩個非常基礎 非常常用的資料結構,常常將會放到一塊兒來比較。兩者有什麼區別 從底層的儲存結構上來看 從下圖中我們看到,陣列需要一塊連續的記憶體空間來儲存,對記憶體的要求比較高。如果申請乙個 100mb 大小的陣列,當記憶體中...
學習筆記 資料結構與演算法(六) 線性表(4)
據說著名猶太歷史學家josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也不要被敵人抓到,於是決定了乙個自殺方式,41個人排成乙個圓圈,由第1個人開始報數,每報數到第3人該人就必須自殺,然後再由下乙個重新報數,直到所有...
Redis 學習筆記4 資料結構的使用
談到資料結構,一定會談到 時間複雜度 在電腦科學中,演算法的時間複雜度是乙個函式,它定性描述該演算法的執行時間。時間複雜度常用大o符號表述。時間複雜度可被稱為是漸近的,即考察輸入值大小趨近無窮時的情況。在 redis 中,用它來表示,基於我們處理的資料的數量,命令執行的速度將會如何。最快的應該是 o...