動態規劃演算法(二)

2021-09-27 03:03:08 字數 1290 閱讀 1507

繼續以例題如入手,不是解題,而是學習動態規劃

題目描述:給定乙個非空字串 s 和乙個包含非空單詞列表的字典 worddict,判定 s 是否可以被空格拆分為乙個或多個在字典**現的單詞。

說明:拆分時可以重複使用字典中的單詞。

你可以假設字典中沒有重複的單詞。

示例 1:

輸入: s = "leetcode", worddict = ["leet", "code"]

輸出: true

解釋: 返回 true 因為 "leetcode" 可以被拆分成 "leet code"。

從動態規劃的角度來解題就是:首先設定狀態,問題是:判定 s 是否可以被空格拆分為乙個或多個在字典**現的單詞。於是狀態設定成前 n 個字元的字串是否能被拆分為乙個或多個在字典**現的單詞,當這個 n 等於 s.size()時,就是解決問題的解。當然這麼說不如畫個圖生動一點。

於是我們用乙個 vector來儲存前 i 字元是否能被拆分為乙個或多個在字典**現的單詞的結果。當我們從後往前遍歷的時候就是上面的流程了。(注意動態規劃要有初始狀態,因為不能確定第乙個字元是否就在字典中,因此假設第乙個字元是"",且在字典中)。

vectorres;

for (size_t i = 1; i <= s.size(); ++i)

}}

例如,給定三角形:

[[ 2 ],

[3, 4 ],

[ 6, 5, 7],

[ 4, 1, 8, 3 ]

]自頂向下的最小路徑和為 11(即,2 + 3 + 5 + 1 = 11)。

解:通過乙個例子,題目意思就清晰了。但是不是加每一層最小的值,題目的規定是每一步只能移動到下一行中相鄰的結點上。也就是說只能2->3、2->4、3->6、3->5、4->5、4->7……

下面開始定義狀態,因為是二維的,所以定義乙個二維的狀態

f(i, j)到(i,j)時的最短路徑長度,於是當 i 是最後一行的時候,遍歷最後乙個陣列就好。當然在這個求解的過程中,最主要的是注意邊界問題。

if (j == 0)//處理邊界問題

else if (j == i)

else

最後其實還有一種思路就是逆向思維,從下面往上找,那則三角形的尖就是最短路徑。這個源**和這兩道題的源**都奉上。芝麻開門

動態規劃演算法

一 動態規劃演算法原理 將待求解的問題分解成若干個相互聯絡的子問題,先求解子問題,然後從這些子問題的解得到原問題的解 對於重複出現的子問題,只在第一次遇到的時候對它進行求解,並把答案儲存起來。了不去求解相同的子問題,引入乙個陣列,把所有子問題的解存於該陣列中,這就是動態規劃所採用的基本方法。動態規劃...

動態規劃演算法

動態規劃 通過把原問題分解為相對簡單的子問題來求解複雜問題。動態規劃常常適用於有重疊子問題和最優子結構性質的問題。演算法總體思想 演算法的基本步驟 演算法的基本要素 最優子結構 重疊子問題 備忘錄方法 問題描述 子串行 公共子串行 最長公共子串行 lcs 問題 問題分析 動態規劃求解lcs問題 最長...

動態規劃演算法

動態規劃演算法的思路 動態規劃法即 dynamic programming method dp 是系統分析中的種常用方法。動態規劃法是20世紀50年代由貝爾曼 r.bellman 等人提出的,用來解決多階段決策過程問題的一種最優化方法。多階段決策過程是指把研究問題分成若干個相互聯絡的階段,由每個階段...