這篇文章介紹unique path等一系列的題目,它們屬於二維動態規劃的問題,[url=之前一篇文章[/url]講過最長公共子串行(lcs), 最長遞增子串行(lis), 最長非降子串行。有興趣的可以看一下,這些都是經典的二維動規問題。
[b]1,unique paths[/b]
給定乙個m*n的矩陣,乙個機械人在這個矩陣的左上方,它試圖走到這個矩陣的右下方,規定機械人只能往右和往下兩個方向走,問有多少種不同的路徑。
我們把這個矩陣抽象成乙個二維陣列grid,機械人開始的位置就是grid[0][0],它可以往下走,也可以往右走,我們初始化陣列讓它的第0列和第0行的值都1,因為機械人到這些地方只有一條路。對於其它的地方grid[i][j] = grid[i-1][j] + grid[i][j-1],因為到達(i, j)點必須經過(i, j-1)和(i, j-1),這樣遞推式就寫出來了。**如下:
public class solution
for(int j = 0; j < n; j ++)
for(int i = 1; i < m; i++)
for(int j = 1; j < n; j++)
return result[m-1][n-1];}}
[b]2,unique paths ii[/b]
給定乙個二維陣列,裡面的值都是0或1,0代表可以到達,1代表不可以到達。其他規則和上題一樣,問有多少種不同的方法。
唯一不同的就是多了障礙物,如果要走到終點,必須要繞過障礙物,換句話說有障礙物的點的值都為0。還要值得注意的是在第0列和第0行中,如果有障礙物,那麼障礙物後面的路都是不通的,都要設定為0。**如下:
public class solution
return obstaclegrid[m-1][n-1];}}
[b]3,minimum path sum[/b]
給定乙個m*n的矩陣,裡面包含著非負整數,從左上方到右下方,找出最小帶權路徑。
這是第一題的變形,在初始化第0列的時候 grid[i][0] += grid[i-1][0]; 第0行的初始化為grid[0][i] += grid[0][i-1]; 第(i,j)點的值我們僅需要去乙個最小的就可以了,grid[i][j] = math.min(grid[i-1][j], grid[i][j-1]) + grid[i][j] (i>=1, j>=1)。**如下:
public class solution
for(int i = 1; i < n; i++)
for(int i = 1; i < m; i++)
for(int j = 1; j < n; j++)
return grid[m-1][n-1];}}
動態規劃總結
華電北風吹 天津大學認知計算與應用重點實驗室 日期 2015 12 7 近期學了幾個動態規劃正好總結一下。裡面不涉及具體問題的具體解法,有問題可以參看我的具體型別的講解部落格。目前所見動態規劃可以劃分為兩類 鏈式和樹形。而且這兩類中的每個節點都是乙個完整的狀態集合。一 鏈式動態規劃 鏈式動態規劃的題...
動態規劃 總結
動態規劃是解決多階段決策問題的一種方法。如果一類問題的求解過程可以分為若干個互相聯絡的階段,在每乙個階段都需作出決策,並影響到下乙個階段的決策,從而確定了乙個過程的活動路線,則稱它為多階段決策問題。思想 在做每一步決策時,列出各種可能的區域性,解依據某種判定條件,捨棄那些肯定不能得到最優解的區域性解...
動態規劃總結
一 知識點整理 一 動態規劃是解決多階段策略問題的一種方法,運用最優性原理,排除重複計算,用空間換時間的演算法。二 動態規劃適用的題目型別有以下幾個特點 1.問題具有多階段的決策 2.每個階段對應乙個狀態 狀態變數 3.每個階段有乙個決策 不同的決策導致下乙個階段不同的狀態 4.每個階段的最優解可以...