此次專題主要講解動態規劃,題目大致分為兩類 一種是遞迴來解決,一種是0/1揹包問題。
動態規劃就是把乙個問題分成多個階段來解決,並且每個階段都相互有所聯絡。其遵循最優性原理。
1,不論初始狀態和第一步決策是什麼,餘下的決策相對於前一次決策所產生的新狀態,構成乙個最優決策序列。
2,最優決策序列的子串行,一定是區域性最優決策子串行。
3,包含有非區域性最優的決策子串行,一定不是最優決策序列。
根據老師課件可以總結為解題步驟:
1,把問題分為若干個子問題就是分為若干個階段
2,建立狀態轉移方程,一般是遞推公式
3,找出邊界條件
4,將邊界值代入方程
5,遞推求解
一,遞迴問題。
有一樓梯共m級,剛開始時你在第一級,若每次只能跨上一級或二級,要走上第m級,共有多少種走法?
這是一道簡單的遞迴問題,沒上乙個台階看做階段,從第三層就能找出規律,他的狀態轉移方程為f(n) = f(n-1)+f(n-2)
之後將邊界值帶入就能求解。
二,求最長序列問題。
求公共最長子序列的題,首先要區別子串行與字串。子串行是可以不連續的,而字串一定是連續的。
我一般的做法就是建立動態規劃陣列dp[i][j]代表當比較到兩個字串的盡頭時的最大公共子串行就是dp[i][j]
如圖:
狀態轉移方程為:dp[i][j] = most(dp[i-1][j],dp[i][j],dp[i][j-1])分別是一串與二串之前有相同字元,同位有相同字元,之後有相同字元,取最大值。
三,0/1揹包問題
典型題目:給你物品數目以及揹包的容量,下面是各個物品的價值以及容量,讓你求揹包能裝入的最大價值
狀態轉移方程:dp[i][j] = most(dp[i][j],dp[i-1][j-w[i])+v[i]);
w[i]即第i件物品的重量 v[i]第i件物品的價值dp[i][j]把前i件物品裝入j容量的揹包中所能獲得的最大價值。
對每件物品就有兩種選擇,放或者不放,取其最大值,如果放這件物品則為dp[i-1][j-w[i]] + v[i],前i-1件物品放入j-w[i]的容量中所能獲得的最大價值,如果不放就是dp[i-1][j]。
完全揹包問題,在0/1揹包問題的基礎上,每種物品不單單是一件了,而是多件。
1) 子問題定義:f[i][j]表示前i種物品中選取若干件物品放入剩餘空間為j的揹包中所能得到的最大價值。
2) 根據第i種物品放多少件進行決策
dp[i][j] = max(f[i-1][j-k*w[i]) + k*v[i],f[i-1][j]) 0<=k*w[i]<=j 就是比0/1揹包問題多加了一層每種物品數量的迴圈
還有分組揹包問題,把物品分成若干組,在每一組中求最優。
動態規劃(3)
robberies include include include includeusing namespace std 這題是參考的 自己的能力還是不可以。不過做了這題,再和0 1揹包問題想一想,覺得收穫還是不錯。說將逃跑率當成物品價值 小弟還是要繼續消化這條題的思想。double f 10020...
動態規劃 3
尼克每天上班之前都連線上英特網,接收他的上司發來的郵件,這些郵件包含了尼克主管的部門當天要完成的全部任務,每個任務由乙個開始時刻與乙個持續時間構成。尼克的乙個工作日為n分鐘,從第一分鐘開始到第n分鐘結束。當尼克到達單位後他就開始幹活。如果在同一時刻有多個任務需要完成,尼克可以任選其中的乙個來做,而其...
ITA 動態規劃3
動態規劃,雙調歐幾里得旅行商問題 旅行商問題描述 平面上n個點,確定一條連線各點的最短閉合旅程。這個解的一般形式為np的 在多項式時間內可以求出 bentley 建議通過只考慮雙調旅程 bitonictour 來簡化問題,這種旅程即為從最左點開始,嚴格地從左到右直至最右點,然後嚴格地從右到左直至出發...