動態規劃的理解和例子集合
理解動態規劃。
它的基本思想是,大事化小,小事化了。
把大的事件一步步分解成小的事件,再把邊界值求出來,就可以通過遞推來求出任何一個狀態了。
首先要想到的最重要的幾點是:1.子問題重疊。2.區域性最優就是整體最優。3.先前的決策不影響後續的決策。
第一個例子:小明上臺階
這個問題沒涉及到區域性最優就是整體最優。
那,問題很簡單,小明可以一次上1個臺階也可以一次上2個臺階,問,他上到n個臺階有多少種走法。
ps:當然這問題你用dfs搜尋也沒問題,就是效率不高。正著搜倒著搜都可以。記憶化不記憶化都可以。
賊多啊,問題太大了。化小。
上到第n個臺階一定是由上一步再上1個臺階或者上一步再上2個臺階的結果。
設函式f是走到第n個臺階的步數,那麼,把上面的那句話翻譯過來就是:
f(n)=f(n-1)+f(n-2)
這個式子就表明了狀態的轉移方程,維度只有1個引數。
那麼,現在找邊界就可以了。f(1)=1,f(2)=3.
這樣任何f(n)通過遞推就可以算出來了。
我們之所以能把f(n)化成f(n-1)和f(n-2)並且能一直化下去,就是因為他的子問題重疊。
相關推薦
動態規劃的理解和例子集合
理解動態規劃。 它的基本思想是,大事化小,小事化了。 把大的事件一步步分解成小的事件,再把邊界值求出來,就可以通過遞推來求出任何一個狀態了。 首先要想到的最重要的幾點是:1.子問題重疊。2.區域性最優就是整體最優。3.先前的決策不影響後續的決策。 第一個例子:小明
遞迴的理解和例子
''' # 遞迴函式 - 優點: _直接簡潔 -缺點: _對遞迴有限制超過報錯(100層)[設定遞迴最大層數 import sys sys.setrecursionlimit(設定遞迴的頂層)] _消耗資源大 ''' # 一個簡單的遞迴 ''' X = 0 def fun
最大子陣列問題的暴力解法,遞迴解法,動態規劃解法和暴力-遞迴混合解法
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <math.h> #define SIZE 5000 #define RANDOM_LIMI
Tsinsen A1210 光稜坦克——動態規劃+字首和優化
題意 一個平面直角座標系上,有N個點,標號為1到N,其中第i個點的座標為(x[i], y[i])。 求滿足以下兩個條件的點列{p[i]}的數目(假設{p[i]}的長度為M) (1) 對任意1 <= i < j <= M,必有y[p[i
動態規劃演算法和c++實現 國王與金礦問題
這個連結講解動態規劃通俗易懂:https://blog.csdn.net/baidu_37107022/article/details/73188963 https://blog.csdn.net/baidu_37107022/article/details/7318912
動態規劃的經典例子
最長不減子序列 一個序列有N個數:A[1],A[2],…,A[N],求出最長非降子序列的長度。 (講DP基本都會講到的一個問題LIS:longest increasing subsequence) 正如上面我們講的,面對這樣一個問題,我們首先要定義
動態規劃-備忘錄和自底向上法解決LCS-python實現
一、計算LCS的長度LCS(longest-common-subsequence problem)就是兩個序列中最長的公共子序列例如:X1=[1,2,3,4,5,6,76,66] X2=[2,453,3,545,4,4324] 在這兩段序列中LCS 為2,3,4定理:
動態規劃——用二進位制表示集合的狀態壓縮DP
動態規劃當中有非常常見的一個分支——**狀態壓縮動態規劃**,很多人對於狀態壓縮畏懼如虎,但其實並沒有那麼難,希望這文章能帶你們學到這個經典的應用。 ## 二進位制表示狀態 在講解多重揹包問題的時候,我們曾經講過二進位制表示法來解決多重揹包。利用二進位制的性質,將多個物品拆分成少數個物品,轉化成了簡單的零
動態規劃和分治法,貪心算法以及遞歸的再一次深刻理解和體會
規劃 動態 分治法 每次體會算法都有新的感覺,刷題越多,對算法的理解感覺也就越深刻。下面我們來重新體會下分治法,動態規劃,貪心法,遞歸的理解。1.分治法: 將問題分成單獨的階段,每個階段互相不幹擾很獨立,如10米長的木棍,切成10段,每段去解決每一段的問題。(階段沒有關系)2.貪心法 站
動態規劃和幾個例子
一.斐波那契佇列 遞迴解法: int fib(int N) { if (N >= 0) return 1; else return fib(N - 1 ) + fib(N - 2); } 若編譯器不進行優化,那麼遞迴解法效率很低,因
對記憶化搜尋(ms)和動態規劃(dp)的深入理解
六月中旬了,馬上就要期末考試了,期末考試結束以後就要迎來緊張刺激的留校集訓,到那時部落格會更新的比較頻繁,而現在在準備期末考試,所以可能更新的部落格稍微少一些。 話不多說,今天來更一篇剛剛吃飯的時候關於記憶化搜尋和動態規劃的一些區別的思考。 記憶化搜尋(M
動態規劃和貪心演算法之揹包問題理解
一.揹包問題 引用書上關於0-1揹包和部分揹包的闡述: 二.貪心與動態規劃區別 關於紅色矩形部分解釋為什麼0-1不能使用貪心演算法,是因為當你選擇一個物品時,整個物品的大小都需要計算,然而揹包的的大小又是固定的,那麼剩下的揹包大小與剩下的物品之間
貪心演算法和動態規劃的個人理解
最近通過各個公司的筆試題發現,好多程式設計題都是貪心演算法和動態規劃演算法。這兩個也容易混淆,在網上也看了好多這兩種演算法的解析,通過這篇文章寫下自己對這兩種演算法的理解。 使用動態規劃的最大特性是原問題的最優解必須包含子問題的最優解。下面通過一個例子解釋:求圖的最短路徑是
動態規劃分析總結——怎樣設計和實現動態規劃算法
基於 進一步 使用 sdn 能夠 疑惑 樓梯 -1 們的 進行算法設計的時候,時常有這種體會:假設已經知道一道題目能夠用動態規劃求解,那麽非常easy找到對應的動態規劃算法並實現;動態規劃算法的難度不在於實現,而在於分析和設計—— 首先你得知道這道題目須要用動態規劃來求
[C++] 動態規劃之矩陣連乘、最長公共子序列、最大子段和、最長單調遞增子序列
每次 種子 () return 避免 amp 可能 text com 一、動態規劃的基本思想 動態規劃算法通常用於求解具有某種最優性質的問題。在這類問題中,可能會有許多可行解。每一個解都對應於一個值,我們希望找到具有最優值的解。 將待求解問題分解成若幹個子問題,先求
9.9遞歸和動態規劃(九)——N皇後
其它 ace req case create lac any urn distance /** * 功能:打印八皇後在8*8棋盤上的各種擺法。當中每一個皇後都不同行、不同列,也不在對角線上。 * 這裏的“對角線”指的是全部的對角線,不僅僅是平分整個棋盤的那兩
51nod 1052 最大M子段和(動態規劃)
表示 image cnblogs class () main png 分享 == 分析:記dp[x][s][1]為從第x個數開始,剩余s段可以分,1表示x跟上一段連著,0表示不連著,遞推式為dp[x][s][1]=max{dp[x+1][s][1]+a[x],dp[x+1
9.9遞歸和動態規劃(六)——打印n對括號的所有有效組合(即左右括號正確配對)
思路 即使 情況 else 字符 ram 配對 字符串 pop /** * 功能:打印n對括號的所有有效組合(即左右括號正確配對)。 */ 兩種方法: 方法一: /** * 思路:在括號的最前面或者原有的每對括號中面插入一對括號。至於其它
HDU acm 1003 Max Sum || 動態規劃求最大子序列和詳解
line namespace num more sequence mem ould 動態規劃 ger Max Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Ot
BZOJ NOI 1999 釘子和小球 動態規劃+分數類
getc namespace += tchar std 有趣的 題目 小數 content 題目大意:不太好描寫敘述,自己看吧。。 思路:首先從最上面的點開始考慮。由於球一定是從最上面開始往下掉,所以球經過最上面的點的概率是1,然後他會有1/2的幾率向左,