記憶化搜尋(DFS) How many ways

2022-03-01 04:46:27 字數 1538 閱讀 1013

這是乙個簡單的生存遊戲,你控制乙個機械人從乙個棋盤的起始點(1,1)走到棋盤的終點(n,m)。遊戲的規則描述如下:

1.機械人一開始在棋盤的起始點並有起始點所標有的能量。

2.機械人只能向右或者向下走,並且每走一步消耗一單位能量。

3.機械人不能在原地停留。

4.當機械人選擇了一條可行路徑後,當他走到這條路徑的終點時,他將只有終點所標記的能量,注意。

如上圖,機械人一開始在(1,1)點,並擁有4單位能量,藍色方塊表示他所能到達的點,如果他在這次路徑選擇中選擇的終點是(2,4)

點,當他到達(2,4)點時將擁有1單位的能量,這就是一種方式,並開始下一次路徑選擇,直到到達(6,6)點。

我們的問題是機械人有多少種方式從起點走到終點。這可能是乙個很大的數,輸出的結果對10000取模。

對於每一組資料第一行輸入兩個整數n,m(1 <= n,m <= 100)。表示棋盤的大小。接下來輸入n行,每行m個整數e(0 <= e < 20)。

6 64 5 6 6 4 3

2 2 3 1 7 2

1 1 4 6 2 7

5 8 4 3 9 5

7 6 6 2 1 5

3 1 1 3 7 2

每次的搜尋函式dfs()原理是一樣的

附**:

1 #include 2 #include 3 #include 4 #include 5

using

namespace

std;

6int dp[110][110];7

int book[110][110];8

intm,n;910

int dfs(int x,int

y)11

17if(book[x][y]>=0

)18

21for(int i=0;i<=dp[x][y];i++)//

當作x的座標

2232}33

}34 book[x][y] = s;//

當前點的總條數

35return s;//

返回給呼叫此次搜尋的地方36}

3738

39int

main()

4050

}51 memset(book,-1,sizeof

(book));

52//

int total = dfs(0,0);

//起始位置

53 cout << dfs(0,0)%10000

<

55return0;

56 }

記憶化搜尋

演算法上依然是搜尋的流程,但是搜尋到的一些解用 動態規劃 的那種思想和模式作一些儲存。一般說來,動態規劃總要遍歷所有的狀態,而搜尋可以排除一些無效狀態。更重要的是搜尋還可以剪枝,可能剪去大量不必要的狀態,因此在空間開銷上往往比動態規劃要低很多。記憶化演算法在求解的時候還是按著自頂向下的順序,但是每求...

記憶化搜尋

記憶化搜尋 演算法上依然是搜尋的流程,但是搜尋到的一些解用動態規劃的那種思想和模式作一些儲存。記憶化演算法在求解的時候還是按著自頂向下的順序,但是每求解乙個狀態,就將它的解儲存下來,以後再次遇到這個狀態的時候,就不必重新求解了。例1.題目描述 給從左至右排好隊的小朋友們分糖果,要求 1.每個小朋友都...

記憶化搜尋

原文 感謝作者。一.動態規劃 動態規劃 dynamic programming 與 分治思想 有些相似,都是利用將問題分 為子問題,並通過合併子問題的解來獲得整個問題的解。於 分治 的不同之處在 於,對於乙個相同的子問題動態規劃演算法不會計算第二次,其實現原理是將每乙個計算過的子問題的值儲存在乙個表...