面試初入演算法(九) 動態規劃

2021-10-04 19:32:52 字數 2418 閱讀 1587

將乙個複雜的問題拆分為重複的子問題,確保每乙個問題都是最優解,從而得出全域性最優解,用遞迴的方式,常用的動態規劃會要求求最大值,最少的方法等。

分治、遞迴、動態規劃、貪心演算法區別(看部落格)

動態規劃的關鍵點:

最優子結構

儲存中間狀態

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

初入職場 面試

這篇屬於第二篇 面試 入職 進入工作 中的子篇 面試,本來我以為一篇文章就搞定了,誰知道,一下羅嗦了這麼多,大家忍受一下吧,見諒!發表在年後工作第一天,也許用得著呢。前奏 準備簡歷和獲得面試 如果你去參與公司組織的面試,至少你已經瞄準了即將從事的工作行業和方向,知道很多剛畢業的學生在投簡歷的時候,有...