將乙個複雜的問題拆分為重複的子問題,確保每乙個問題都是最優解,從而得出全域性最優解,用遞迴的方式,常用的動態規劃會要求求最大值,最少的方法等。
分治、遞迴、動態規劃、貪心演算法區別(看部落格)
動態規劃的關鍵點:
最優子結構
儲存中間狀態
得出dp公式
現在以乙個簡單的題進入,從而了解什麼是動態規劃
斐波那契數,通常用 f(n) 表示,形成的序列稱為斐波那契數列。該數列由 0 和 1 開始,後面的每一項數字都是前面兩項數字的和。也就是:
f(0) = 0, f(1) = 1
f(n) = f(n - 1) + f(n - 2), 其中 n > 1.
給定 n,計算 f(n)。
在該題中,如果我們使用傻遞迴,則會導致時間複雜度為o(2^n)
所以我們選用一維dp,用dp陣列來存放值
int
fib(
int n)
return current;
}
1.三角形最小路徑和給定乙個三角形,找出自頂向下的最小路徑和。每一步只能移動到下一行中相鄰的結點上。
例如,給定三角形:
[[2],
[3,4],
[6,5,7],
[4,1,8,3]
]自頂向下的最小路徑和為 11(即,2 + 3 + 5 + 1 = 11)。
演算法:1.找到重複性
每次真能走左邊或者右邊 dp[i][j]–>dp[i+1][j] dp[i+1][j+1]
problem(i,j) = min(subproblem(i+1,j),subproblem(i+1,j+1))+ dp[i,j];
2.定義狀態陣列
dp中存的是走到最後一行的最短路徑值
3.dp方程
dp[i][j] = min(dp[i+1][j],dp[i+1][j+1])+dp[i,j]
int
minimumtotal
(vector
int>>
& ********)
}return ********[0]
[0];
}
//自頂向下 記憶化搜尋
//其中level相當於row,col相當於列
intrecursive
(int level,
int col,vector
int>>
& ********,vector
int>>
& cache)
//自頂向下 記憶化搜尋
intminimumtotal
(vector
int>>
& ********)
2.最長公共子串行給定兩個字串 text1 和 text2,返回這兩個字串的最長公共子串行。
乙個字串的 子串行 是指這樣乙個新的字串:它是由原字串在不改變字元的相對順序的情況下刪除某些字元(也可以不刪除任何字元)後組成的新字串。
例如,「ace」 是 「abcde」 的子串行,但 「aec」 不是 「abcde」 的子串行。兩個字串的「公共子串行」是這兩個字串所共同擁有的子串行。
若這兩個字串沒有公共子串行,則返回 0。
示例 1:
輸入:text1 = 「abcde」, text2 = 「ace」
輸出:3
解釋:最長公共子串行是 「ace」,它的長度為 3。
示例 2:
輸入:text1 = 「abc」, text2 = 「abc」
輸出:3
解釋:最長公共子串行是 「abc」,它的長度為 3。
示例 3:
輸入:text1 = 「abc」, text2 = 「def」
輸出:0
解釋:兩個字串沒有公共子串行,返回 0。
演算法:1.使用二維陣列的方式,記錄字元之間的公共子串行
2. 從後向前比較,若最後乙個字元相等
array[row,col] = array[row-1,col-1]+1;
3.若最後乙個字元不相等
array[row,col] = max(array[row-1,col],array[row,col-1]);
展示:
int
longestcommonsubsequence
(string text1, string text2)
}return dp[rows]
[cols]
;}
初入演算法篇(動態規劃)書架問題2
題意 將n本書按高度由小到大排序,然後求出書架的不整齊度。不整齊度 每兩本書寬度的差的絕對值的和 如有4本書 1 2 5 3 2 4 3 1 排序後 1 2 2 4 3 1 5 3 不整齊度就是2 3 2 7,求出去掉k本書後最小不整齊度 題解 逆向思維,求出n k本書的最小不整齊度即可 轉移方程為...
演算法 九 動態規劃
總結 動態規劃,一般來說,首先弄明白暴力遞迴怎麼做 嘗試 然後再優化 避免重複計算 把暴力遞迴的過程抽象成狀態表達。漢諾塔 漢諾塔問題 列印n層漢諾塔從最左邊移動到最右邊的全部過程 public class code 02 hanoi public static void func int rest...
初入職場 面試
這篇屬於第二篇 面試 入職 進入工作 中的子篇 面試,本來我以為一篇文章就搞定了,誰知道,一下羅嗦了這麼多,大家忍受一下吧,見諒!發表在年後工作第一天,也許用得著呢。前奏 準備簡歷和獲得面試 如果你去參與公司組織的面試,至少你已經瞄準了即將從事的工作行業和方向,知道很多剛畢業的學生在投簡歷的時候,有...