劉書學習筆記(4)線性結構上的dp(上)

2021-08-07 22:39:33 字數 1431 閱讀 4625

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...