動態規劃經典案例

2021-08-13 21:04:50 字數 2138 閱讀 5806

②《程式設計師**面試指南-it名企演算法與資料結構題目最優解》——左程雲

有n級台階,乙個人每次上一級或者兩級,問有多少種走完n級台階的方法,當n為1時,f(n) = 1,n為2時,f(n) =2,就是說當台階只有一級的時候,方法數是一種,台階有兩級的時候,方法數為2。那麼當我們要走上n級台階,必然是從n-1級台階邁一步或者是從n-2級台階邁兩步,所以到達n級台階的方法數必然是到達n-1級台階的方法數加上到達n-2級台階的方法數之和。即f(n) = f(n-1)+f(n-2)

function

goupstairs

(n)

if(n%2===0)else

}

給定陣列arr,返回arr的最長遞增子串行的長度,比如arr=[2,1,5,3,6,4,8,9,7],最長遞增子串行為[1,3,4,8,9]返回其長度為5。dp[i]表示以必須arr[i]這個數結束的情況下產生的最大遞增子串行的長度。對於第乙個數來說,很明顯dp[0]為1,當我們計算dp[i]的時候,我們去考察i位置之前的所有位置,找到i位置之前所有比arr[i]小的位置中dp最大的那個值,記為dp[j],dp[j]代表以arr[j]結尾的最長遞增序列,而dp[j]又是之前計算過的最大的那個值,則dp[i]=dp[j]+1。計算完dp之後,我們找出dp中的最大值,即為這個串的最長遞增序列

function

maxstr

(arr) else

}return

math.max(...temp)

}

給定乙個矩陣m,從左上角開始每次只能向右走或者向下走,最後達到右下角的位置,路徑中所有數字累加起來就是路徑和,返回所有路徑的最小路徑和。dp[i][j]表示的是從原點到i,j位置的最短路徑和。我們首先計算第一行和第一列,直接累加即可,那麼對於其他位置,要麼是從它左邊的位置達到,要麼是從上邊的位置達到,我們取左邊和上邊的較小值,然後加上當前的路徑值,就是達到當前點的最短路徑。然後從左到右,從上到下依次計算即可。

function

minmatrixdistance

(arr)

for(let i=1;i

[0].

length;i++)

for(let i=1;i

length;i++)

}return arr

}

給定兩個字串str1和str2,返回兩個字串的最長公共子串行,例如:str1=」1a2c3d4b56」,str2=」b1d23ca45b6a」,」123456」和」12c4b6」都是最長公共子串行,則最長公共子串行長度為6,dp[i][j]的值必然和dp[i-1][j],dp[i][j-1],dp[i-1][j-1]相關,dp[i][j]取三者之間的最大值

function

maxtogetherstr

(str1, str2) }}

return arr

}

地牢是由m*n個方格構成的網格,騎士位於地牢左上角,公主位於地牢右下角,騎士必須從地牢左上角到達右下角去消滅魔鬼拯救公主,初始時騎士有一正數表示血量,當其血量不大於0時,拯救失敗,同時每一步只能向下或向右,請寫乙個函式求出騎士最少的血量是多少才能救出公主。

dp[i][j] 的含義是如果騎士要走上位置(i,j),並且從該位置選一條最優路徑,最後走到右下角,騎士起碼應該具備的血量。騎士還要面臨向下還是向右的選擇,dp[i][j+1] 是騎士選擇當前向右走並最終到右下角的血量要求。同理,dp[i+1][j] 是向下走的要求。如果騎士決定向右走,那麼騎士在當前位置加完血或者扣完血之後的血量只要等於dp[i][j+1] 即可。那麼騎士在加血或扣血之前的血量要求(也就是沒有踏上(i,j)位置之前的血量要求),就是dp[i][j+1]-map[i][j]。同時,騎士血量要隨時不少於1,所以向右的要求為max。如果騎士決定向下走,分析方式相同,向下的要求為max。

let arr=[[-2,-3,3],[-5,-10,1],[0,30,-5]];

function

search

(arr)

for(let i=n-2;i>=0;i--)

for(let i=n-2;i>=0;i--)

}return dp;

}search(arr);

動態規劃演算法經典案例

動態規劃演算法是從暴力搜尋演算法優化過來的,如果我們不清楚暴力搜尋的過程,就難以理解動態規劃的實現,當我們了解了動態規劃演算法的基本原理的文字概述,實現條件之後,這時可能並不是太理解這種思想,去面對實際問題的時候也是無從下手,這個時候我們不能停留在文字層面上,而應該去學習經典動態規劃演算法的實現,然...

動態規劃及其動態規劃經典例題

動態規劃是最重要 最經典的演算法之一,學好動態規劃對我們十分重要,掌握動態規劃對解決某些問題會起到事半功倍的效果。特點 可以把原始問題劃分為一系列子問題 求解每個子問題僅一次,並將其結果儲存到乙個表中,以後用到時直接訪問,不重複計算,節省時間。自底向上地計算 適用範圍 原問題可以分為多個相關子問題,...

動態規劃經典問題

from 實現在 維基百科對動態規劃的定義 動態規劃 英語 dynamic programming,簡稱dp 是一種在數學 電腦科學和經濟學中使用的,通過把原問題分解為相對簡單的子問題的方式求解複雜問題的方法。動態規劃常常適用於有重疊子問題 1 和最優子結構性質的問題,動態規劃方法所耗時間往往遠少於...