這是乙個簡單的生存遊戲,你控制乙個機械人從乙個棋盤的起始點(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 5using
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 與 分治思想 有些相似,都是利用將問題分 為子問題,並通過合併子問題的解來獲得整個問題的解。於 分治 的不同之處在 於,對於乙個相同的子問題動態規劃演算法不會計算第二次,其實現原理是將每乙個計算過的子問題的值儲存在乙個表...