有乙個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步的種類數,即...