How many ways (記憶化搜尋)

2021-08-21 20:56:15 字數 1237 閱讀 2242

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

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

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

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

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

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

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

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

第一行輸入乙個整數t,表示資料的組數。 

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

對於每一組資料輸出方式總數對10000取模的結果.

1

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

3948
題意:有乙個矩陣,矩陣上每個點代表從這一步開始最多能走的步數,每次只能往右,往下走。問從左上角到右下角有多少種方式。

思路:因為每次走的時候不一定要把剩餘步數走完,也是說在此前可以到達的點上可以重新選擇一條路徑。我們可以從左上角開始進行記憶化搜尋。把每個點能到達右下角的路徑數給記錄下來,下次再到達這個點的時候就可以直接應用的這數了,記憶化搜尋能極大的減少時間複雜度。

**如下:

#include#includeint n,m,num[110][110],book[110][110];

int dfs(int x,int y)

return book[x][y]; //返回從這個點到目標點得路徑數

}int main()

}

skiing 記憶化深搜

這道題就是找出一條最長連續遞減序列,並求出其長度。可以用記憶化深搜,求出每一點最長序列的長度,然後求最大值即可。如下 include includeusing namespace std const int n 105 int a n n m,n,f n n inline int max int a...

poj1661Help Jimmy 記憶化搜尋

這是找的倒數第二簡單的,然而依舊不會,淚 昨天晚上調出來發現是 以示例為例 從倒數第二個平台直接跳下去 時間是0 從上面第乙個跳下去 時間依舊是0 orz 12點半躺床上頓悟應該每個平台的時間不僅是乙個,有左右兩個時間 唯一值得欣慰是發現了 dp值裡面不用加上高度下落的時間差,最後dp 下落的高度,...

HDU1501 Zipper(DFS 記憶化搜尋)

題意 給三個字串,保證第三個串長度是前兩個串長度之和,確定前兩個串保持原有的字母順序能不能拼成第三個串。思路 直接搜尋的話會有大量重複的運算,要用記憶化陣列記錄之前的結果。當匹配到第乙個串的第i位和第二個串的第j位時,前面可能有多種情況,但三個串後面的長度一定,所以結果也可以確定,用vis i j ...