日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

不同路径 II-dp

發布時間:2023/12/4 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 不同路径 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;
然后我們想想如何初始化,因為機器人從左上角一直往左走,或者一直往下走,只有一種走法,然后如果這路徑有障礙,后面的路就無法走了,當然,如果最開始左上角的位置就有障礙,那就根本走不到右下角,故初始化代碼如下:

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];}

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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。