歷屆試題 地宮取寶 dfs 記憶化

2021-07-10 11:08:10 字數 1374 閱讀 2221

歷屆試題 地宮取寶  

時間限制:1.0s   記憶體限制:256.0mb

問題描述

x 國王有乙個地宮寶庫。是 n x m 個格仔的矩陣。每個格仔放一件寶貝。每個寶貝貼著價值標籤。

地宮的入口在左上角,出口在右下角。

小明被帶到地宮的入口,國王要求他只能向右或向下行走。

走過某個格仔時,如果那個格仔中的寶貝價值比小明手中任意寶貝價值都大,小明就可以拿起它(當然,也可以不拿)。

當小明走到出口時,如果他手中的寶貝恰好是k件,則這些寶貝就可以送給小明。

請你幫小明算一算,在給定的局面下,他有多少種不同的行動方案能獲得這k件寶貝。

輸入格式

輸入一行3個整數,用空格分開:n m k (1<=n,m<=50, 1<=k<=12)

接下來有 n 行資料,每行有 m 個整數 ci (0<=ci<=12)代表這個格仔上的寶物的價值

輸出格式

要求輸出乙個整數,表示正好取k個寶貝的行動方案數。該數字可能很大,輸出它對 1000000007 取模的結果。

樣例輸入

2 2 2

1 22 1

樣例輸出 2

樣例輸入

2 3 2

1 2 3

2 1 5

樣例輸出

14

剛開始坐著道題的時候,想到的就是搜尋遞迴來做,寫好了**,提交是超時的,然後一直想著怎麼把遞迴變成陣列來實現,,,未果。

最後得知需要記憶化搜尋,那麼問題來了什麼是記憶化搜尋呢,因為我們不同遞迴的時候,會對以前遞迴過的位置又重複遞迴了,這樣肯定效率很低,所以超時了,於是乎,我只需要對每次遞迴過的位置都進行標記或者說賦值給他,這個值是從這個位置到最後出口所可能的方案數,即題中的s,最後把這個s賦值給標價陣列vis即可,,

#include #include #include #include #include #define n 1000000007

using namespace std;

int n,m,k,mm;

int ary[55][55];

int vis[55][55][15][15];

int fun(int x,int y,int cnt,int mm)

long s = 0;

//下if(x+1 <= n)

s += fun(x+1,y,cnt,mm);

s %= n;

} //右

if(y+1 <= m)

s += fun(x,y+1,cnt,mm);

s %= n;

} return vis[x][y][cnt][mm+1] = s%n;

}int main()

} fun(1,1,0,-1);

cout<

歷屆試題 地宮取寶 (dfs 記憶化)

時間限制 1.0s 記憶體限制 256.0mb 問題描述 x 國王有乙個地宮寶庫。是 n x m 個格仔的矩陣。每個格仔放一件寶貝。每個寶貝貼著價值標籤。地宮的入口在左上角,出口在右下角。小明被帶到地宮的入口,國王要求他只能向右或向下行走。走過某個格仔時,如果那個格仔中的寶貝價值比小明手中任意寶貝價...

歷屆試題 地宮取寶 記憶化搜尋

問題描述 x 國王有乙個地宮寶庫。是 n x m 個格仔的矩陣。每個格仔放一件寶貝。每個寶貝貼著價值標籤。地宮的入口在左上角,出口在右下角。小明被帶到地宮的入口,國王要求他只能向右或向下行走。走過某個格仔時,如果那個格仔中的寶貝價值比小明手中任意寶貝價值都大,小明就可以拿起它 當然,也可以不拿 當小...

歷屆試題 地宮取寶 簡單dfs

問題描述 x 國王有乙個地宮寶庫。是 n x m 個格仔的矩陣。每個格仔放一件寶貝。每個寶貝貼著價值標籤。地宮的入口在左上角,出口在右下角。小明被帶到地宮的入口,國王要求他只能向右或向下行走。走過某個格仔時,如果那個格仔中的寶貝價值比小明手中任意寶貝價值都大,小明就可以拿起它 當然,也可以不拿 當小...