牛客演算法題 機械人走方格II 動態規劃

2021-08-27 11:50:58 字數 1078 閱讀 8364

有乙個xxy的網格,乙個機械人只能走格點且只能向右或向下走,要從左上角走到右下角。請設計乙個演算法,計算機械人有多少種走法。注意這次的網格中有些障礙點是不能走的。

給定乙個intmap(c++ 中為vector >),表示網格圖,若map[i][j]為1則說明該點不是障礙點,否則則為障礙。另外給定intx,inty,表示網格的大小。請返回機械人從(0,0)走到(x - 1,y - 1)的走法數,為了防止溢位,請將結果mod 1000000007。保證x和y均小於等於50

題解:該題首先想到的是用dfs遞迴求解,但是資料太大,會超時或者超記憶體。但是仔細思考,該題存在最優子結構,所以使用動態規劃來求解。

適合使用動態規劃求解的問題:

1,最優子結構

母問題的最優解包含其子問題的最優解,我們就稱此問題具有最優子結構。即也就是說,子問題最優時,母問題通過優化一定能求得最優解

2,子問題重疊

子問題本質上是和母問題一樣的,只是問題的輸入引數不一樣,就可以稱之為子問題重疊,這是動態規劃解決問題的高效的本質所在,我們可以利用很多子問題具有相同的輸入引數這乙個性質,來減少計算量。

能採用動態規劃求解的問題的一般要具有3個性質:

1.最優化原理:如果問題的最優解所包含的子問題的解也是最優的,就稱該問題具有最優子結構,即滿足最優化原理。

2.無後效性:某狀態以後的過程不會影響以前的狀態,只與其以前的狀態有關。

dfs法(錯誤)

int dx = ;

int dy = ;

class robot

void dfs(vector> map, int maxx, int maxy, int x, int y, long &ans)

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

else if(i != 0 && j == 0)//同理

else if(i != 0 && j!= 0)//可以從i, j - 1和i - 1 ,j 兩個位置過來。}}

return d[x - 1][y - 1];

}};

機械人走方格II

有乙個xxy的網格,乙個機械人只能走格點且只能向右或向下走,要從左上角走到右下角。請設計乙個演算法,計算機械人有多少種走法。注意這次的網格中有些障礙點是不能走的。給定乙個int map c 中為vector 表示網格圖,若map i j 為1則說明該點不是障礙點,否則則為障礙。另外給定int x,i...

機械人走方格II

有乙個xxy的網格,乙個機械人只能走格點且只能向右或向下走,要從左上角走到右下角。請設計乙個演算法,計算機械人有多少種走法。注意這次的網格中有些障礙點是不能走的。給定乙個intmap c 中為vector 表示網格圖,若map i j 為1則說明該點不是障礙點,否則則為障礙。另外給定intx,int...

機械人走方格

一 有乙個xxy的網格,乙個機械人只能走格點且只能向右或向下走,要從左上角走到右下角。請設計乙個演算法,計算機械人有多少種走法。給定兩個正整數int x,int y,請返回機械人的走法數目。保證x y小於等於12。思路 共需走x y步,其中有x步向又走,y步向左走,即從x y步中選出x步的種類數,即...