繼續以例題如入手,不是解題,而是學習動態規劃題目描述:給定乙個非空字串 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 等人提出的,用來解決多階段決策過程問題的一種最優化方法。多階段決策過程是指把研究問題分成若干個相互聯絡的階段,由每個階段...