不同路径 II-dp
題目背景
一個機器人位于一個 n x m 網格的左上角 機器人每次只能向下或者向右移動一步。它試圖達到網格的右下角
題目描述
現在考慮網格中有障礙物。那么從左上角到右下角將會有多少條不同的路徑? 網格中的障礙物和空位置分別用 1 和 0 來表示。
輸入格式
第一行兩個數n,m,
第二行到n+1行為網格
輸出格式
路徑總數
輸入輸出樣例
輸入
3 3
000
010
000
輸出
2
說明/提示
1 <= m, n <= 100
網格里只有 0 或 1
另: 對于樣例,3x3 網格的正中間有一個障礙物。 從左上角到右下角一共有 2 條不同的路徑:
向右 -> 向右 -> 向下 -> 向下
向下 -> 向下 -> 向右 -> 向右
解題思路:
這題跟不同路徑 I的區別就是加了障礙,不過也是簡單題,我們只要標記障礙的位置,用st數組進行標記,記住,這題輸入的話要用char,如果我們用int,當我們輸入數字0和1時,因為之間沒有空格,計算機是不知道數字怎么分開的,所以用char讀入。首先我們定義dp[i][j]表示為機器人從左上角走到(i,j)這個點的走法總數,然后因為機器人每次只能向下或者向右移動一步,所以不難想到關系表達式為:
dp[i][j] = dp[i-1][j]+dp[i][j-1];
當機器人遇到障礙,dp[i][j] = 0;
然后我們想想如何初始化,因為機器人從左上角一直往左走,或者一直往下走,只有一種走法,然后如果這路徑有障礙,后面的路就無法走了,當然,如果最開始左上角的位置就有障礙,那就根本走不到右下角,故初始化代碼如下:
ac代碼如下:
#include <iostream> using namespace std; const int N = 110; char g[N][N]; bool st[N][N]; int dp[N][N];int main() {int n, m;cin >> n >> m;for (int i = 0; i < n; i++)for (int j = 0; j < m; j++) {cin >> g[i][j];if (g[i][j] == '1')st[i][j] = true;}if (st[0][0]) {cout << "0" << endl;return 0;}elsedp[0][0] = 1;for (int i = 1; i < n; i++) {if (st[i][0])dp[i][0] = 0;elsedp[i][0] = dp[i - 1][0];}for (int i = 1; i < m; i++) {if (st[0][i])dp[0][i] = 0;elsedp[0][i] = dp[0][i - 1];}for (int i = 1; i < n; i++)for (int j = 1; j < m; j++) {if (st[i][j])dp[i][j] = 0;elsedp[i][j] = dp[i - 1][j] + dp[i][j - 1];}cout << dp[n - 1][m - 1] << endl;return 0; }總結
以上是生活随笔為你收集整理的不同路径 II-dp的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 拔罐减肥的好处和坏处有哪些
- 下一篇: 艾灸如何治疗宫颈炎