演算法設計思想之「動態規劃」

2022-09-20 17:48:07 字數 1128 閱讀 8195

關鍵區別

典例代表

動態規劃

子問題相互重疊

斐波那契數列

分而治之

子問題獨立

翻轉二叉樹

1.1 題目描述

1.2 解題思路

輸入:n = 3

輸出:3

解釋:有3種方法可以爬到樓頂

1 階 + 1 階 + 1階

2 階 + 1 階

1 階 + 2 階

1.3 解題步驟
// 空間複雜度:o(n)

function climbstairs(n)

let dp = [1, 1];

for(let i = 2; i <= n; i++)

return dp[n]

}// 空間複雜度:o(1)

function climbstairs(n)

let dp0 = 1, dp1 = 1;

for(let i = 2; i <= n; i++)

return dp1

}

1.4 時間複雜度&空間複雜度2.1 題目描述

2.2 解題思路

輸入:[1,2,3,1]

輸出:4

解釋:偷竊 1 號房屋 (金額 = 1) ,然後偷竊 3 號房屋 (金額 = 3)

偷竊到的最高金額 = 1 + 3 = 4

2.3 解題步驟
// 空間複雜度:o(n)

function rob(nums)

const dp = [0, nums[0]];

for(let i = 2; i <= nums.length; i++)

return dp[dp.length - 1]

}// 空間複雜度:o(1)

function rob(nums)

let dp0 = 0, dp1 = nums[0];

for(let i = 2; i <= nums.length; i++)

return dp1

}

2.4 時間複雜度&空間複雜度定義子問題

反覆執行

常見演算法思想之動態規劃 貪婪演算法

最近總是跟動態規劃打交道,索性就將其弄明白一點。所謂的動態規劃並不是一種具體的演算法,而是一種演算法的思想。思想總是抽象的,縹緲的。所以在學習動態規劃的時候會有一種很尷尬的情況,就是感覺這個東西很簡單,但是又不知道自己是不是真的學會了。簡單的來說,動態規劃就是將乙個大問題分解為子問題,然後根據子問題...

演算法基本思想之動態規劃

動態規劃 談到演算法最優解 則首先會想到兩個演算法第乙個是貪心演算法,其次才會是動態規劃 再者從問題解決規模的相似程度來看,可能會引出另外的乙個演算法叫做 分治法 更準確的來講叫做分治思想 有乙個問題是 現在假定學校要從計算機工程系選出本年度的三好學生,假定其名額一共有三個,其中學校計算機工程系的學...

演算法思想 動態規劃

我所理解的動態規劃,其本質是對遞迴的優化。所以一般需要先找出其遞迴方式,才能進一步地優化。但是,只要刷題數量達到了一定程度,就會隱約感覺到有乙個解題模板,只需要按照這個模板去比對各種條件就可以解題。狀態,動態規劃都會使用到輔助陣列來記錄問題的解,這些陣列的下標具有重要作用,一定要弄明白下標究竟表示哪...