今天這篇博文介紹一下動態規劃。先看下邊的經典問題:
最長增長子串
例如 3,2,6,4,5,1 的最長增長子串是 2,4,5. 先看一下實現**。
#include #include using namespace std;
void prt(vector&d)
**不多,這個問題如果採用暴力方法,就是考慮所有的組合, 這是乙個指數複雜度問題。
動態規劃問題的核心是找到狀態轉移方程,對於這個問題,經典的解法是這樣:
d =
l[0]:3
l[1]:2
l[2]:2,6
l[3]:2,4
l[4]:2,4,5
l[5]:1
上面 假設資料為d[n], l[i]的表示以a[i]結尾的最長子串 ,那麼狀態轉移方程為:l[i] = max(l[j]| j 看到這裡,動態規劃的知識就講完了。
接著我們進入第二個經典問題最長公共子串問題
accgggttac 和 aggacca的最長公共子串,
長度為1的公共子串為:
長度為2的公共子串為:
長度為3的公共子串為:
求是否還有長度為4的公共子串,是否還有長度為5的, 注意子串不要求連續。
最終最長的子串長度是多少?這個問題的複雜度也是乙個指數問題。下邊是**
#include #include #include using namespace std;
void prtm(vector> &c)
printf("\n"); }}
void calc_lcs(string& x, string& y)
for (int i = 1; i < x.size(); i++)
else if (c[i][j - 1] > c[i - 1][j])
else
} }prtm(c);//print matrix
}int main()
這個問題我自己想了3天也沒想出來,是看了網上的解法才知道的。各位要是自己想出來了,那就是很厲害了。
最後的話:
知識點8 動態規劃總結
今天也是為了cc,努力奮鬥的一天 o 前面幾節介紹了動態規劃的相關概念,並求解了一些經典的動態規劃模型。但是在實際碰到新的問題時,初學者總是容易陷入頭腦一片空白 完全無法設計狀態的情況,這是正常現象,因為動態規劃本身就需要經驗的積累和大量做題才能有較大的提公升。不過從上面的經典模型中還是能總結出一些...
知識點 漫談設計模式 04
factory method 4.1 概述 如何使用工廠方法模式,建立普通的類。場景 只關心該介面提供的功能 建立過程複雜。如需要初始化其他關聯的資源類,讀取配置檔案等等 介面有很多具體實現或者抽象類有很多子類時,你可能需要為客戶 寫一大串if else邏輯來決定使用 哪個具體實現或者子類。不理解為...
未完成 知識點 動態規劃優化初步
1 前言 這將是本時期的最後一篇知識點,講解動態規劃的優化演算法。2 概念 動態規劃眾所周知,在很多情況下時間複雜度是很容易判斷的,因為其主體就是for迴圈。侷限於設計狀態和寫出狀態轉移方程顯然是不夠的,有時候資料過大可能需要我們對其進行一定的優化。下面就是幾種比較典型的優化方式。3 單調佇列 單調...