動態規劃求解路徑問題

2021-08-19 10:10:23 字數 1704 閱讀 2048

動態規劃求解的兩個條件:

1)最優解問題

2)大問題可以拆分成小問題,大問題的最優解包含小問題的最優解,將小問題的最優解儲存起來,在求大問題最優解的時候無需重新求解,直接拿來用即可。

具體問題

需求一:

給定m*n矩陣,從左上角出發,到右下角,每次只能向右走或者向下走,求共有多少路徑?

分析:假設路徑數是f(m, n),那麼第一步如果向右走,那麼有f(m, n-1)種走法,如果第一步向下走,那麼有f(m-1, n)種走法,所以可以得到遞推式:f(m, n) = f(m, n-1) + f(m-1, n)。這樣就可以使用dp求解。並且,如果m或n為1,即只有一行或者只有一列,那麼共有一條路徑。可以建立int[m+1][n+1]陣列,給只有一行/一列的元素置1,然後遞推求解。

**:

class solution 

return dp[m][n];

}}

需求二:

給定二維陣列m*n,每個元素的值表示距離,求從[0][0]到[m-1][n-1]的最短距離,每次只能向右走或者向下走。

分析:動態規劃的問題。我們可以正向求解,求出起點到每個點的最短距離,也可以反向求解,求出每個節點到終點的最短距離。

1)正向求解

對於第乙個點,距離就是它的值。對於第一行的點,到起點的最短距離就是當前點的值加上左邊點到起點的最短距離。對於第一列的點,到起點的最短距離就是當前點到上乙個點到起點的最短距離。對於其它的點,要麼是從上面的點過來,要麼是從下面的點過來,所以求二者的最小值,加上當前點的值即可。最後返回終點到起點的距離即可。

2)反向求解

對於最後乙個點,距離就是它的值。對於最後一行的點,到終點的最短距離就是當前值加上右邊點到終點的最短距離。對於最後一列的點,到終點的距離就是當前值加上其下面乙個點到終點最短距離。對於其它的點,要麼是向右走,要麼向下走,選擇二者的較小值加上當前值即為最短距離。最後返回起點到終點的距離。

3)原始陣列是否可以改變?

如果可以改變,那麼可以直接在原始陣列上進行修改,如果正向求解,那麼修改後的陣列中的值就是到起點的最短距離,如果是反向求解,那麼修改後的陣列中的值就是到終點的最短距離。

如果不可以改變,那麼需要建立和原始陣列同大小的陣列,正向求解和反向求解的結果同上。

**:

class solution 

}return grid[grid.length-1][grid[0].length-1];

/*//思路二:修改陣列,反向求解

for(int i = grid.length-1; i >= 0 ; i--)

}return grid[0][0];

*//*

//思路三:開闢新的陣列,正向求解

int row = grid.length, col = grid[0].length;

int dp = new int[row][col];

for(int i = row-1; i >= 0; i--)

}return dp[0][0];

*//*

//思路四:開闢新的陣列,正向求解

int row = grid.length, col = grid[0].length;

int dp = new int[row][col];

for(int i = 0; i < row; i++)

}return dp[row-1][col-1];*/}

}

動態規劃求解投資問題

問題 設 m 元錢,n 項投資,函式f x 表示將 x 元投入第 i 項專案所產生的效益,i 1,2,n.問 如何分配這m元錢,使得投資的總效益最高?解析可以設dp i j cost i j 陣列,dp代表花費j元投資前i項的所獲取的最優效益,cost代表dp i j 情況在第i專案上花費的金額,從...

動態規劃 求解金礦問題

題目描述 很久很久以前,有乙個國王擁有5座金礦,每座金礦的 儲量不同,需要參與挖掘的工人人數也不相同。例如 有的金礦儲存量是500kg 需要5個工人來挖 有的金礦儲存量是200kg 需要3個工人來挖 如果參與挖礦的工人總數是10,每座金礦要麼全挖,要麼不挖,不能派出一半人挖取一半的金礦,想要得到盡可...

線性規劃求解路徑問題

給定乙個帶權重的有向圖g v,e v為頂點集,e為有向邊集,每一條有向邊均有乙個權重。對於給定的頂點s t,以及v的子集v 尋找從s到t的不成環有向路徑p,使得p經過v 中所有的頂點 對經過v 中節點的順序不做要求 記邊的變數為ei 對應權重為ci 點記為vi 其出邊記為vo ji,其入邊記為vi ...