不同路径和***
動(dòng)態(tài)規(guī)劃
機(jī)器人從(0 , 0) 位置出發(fā),到(m - 1, n - 1)終點(diǎn)。
按照動(dòng)規(guī)五部曲來分析:
確定dp數(shù)組(dp table)以及下標(biāo)的含義
dp[i][j] :表示從(0 ,0)出發(fā),到(i, j) 有dp[i][j]條不同的路徑。
確定遞推公式
想要求dp[i][j],只能有兩個(gè)方向來推導(dǎo)出來,即dp[i - 1][j] 和 dp[i][j - 1]。
此時(shí)在回顧一下 dp[i - 1][j] 表示啥,是從(0, 0)的位置到(i - 1, j)有幾條路徑,dp[i][j - 1]同理。
那么很自然,dp[i][j] = dp[i - 1][j] + dp[i][j - 1],因?yàn)閐p[i][j]只有這兩個(gè)方向過來。
dp數(shù)組的初始化
如何初始化呢,首先dp[i][0]一定都是1,因?yàn)閺?0, 0)的位置到(i, 0)的路徑只有一條,那么dp[0][j]也同理。
確定遍歷順序
這里要看一下遞歸公式dp[i][j] = dp[i - 1][j] + dp[i][j - 1],dp[i][j]都是從其上方和左方推導(dǎo)而來,那么從左到右一層一層遍歷就可以了。
這樣就可以保證推導(dǎo)dp[i][j]的時(shí)候,dp[i - 1][j] 和 dp[i][j - 1]一定是有數(shù)值的。
舉例推導(dǎo)dp數(shù)組
時(shí)間復(fù)雜度:O(m * n) 空間復(fù)雜度:O(m * n) class Solution { public:int uniquePaths(int m, int n) {int dp[m][n];for(int ii=0;ii<n;ii++) dp[0][ii]=1;for(int jj=0;jj<m;jj++) dp[jj][0]=1;for(int ii=1;ii<m;ii++){for(int jj=1;jj<n;jj++){dp[ii][jj]=dp[ii][jj-1]+dp[ii-1][jj];}}return dp[m-1][n-1];} }; class Solution { public:int uniquePaths(int m, int n) {vector<vector<int>> dp(m, vector<int>(n, 0));for (int i = 0; i < m; i++) dp[i][0] = 1;for (int j = 0; j < n; j++) dp[0][j] = 1;for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {dp[i][j] = dp[i - 1][j] + dp[i][j - 1];}}return dp[m - 1][n - 1];} };總結(jié)