藍橋杯 歷屆試題 地宮取寶

2022-06-23 13:21:09 字數 3069 閱讀 8883

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

1 #include2 #include3

#define n 1000000007

4using

namespace

std;

5int

n,m,k;

6int map[103][103];7

int dp[53][53][15][15];/*

6 */

8int dir[4][2]=;

9int dfs(int x,int y, int num,int

maxa)

18long

long s=0;/*

5 */

//每進入一次dfs就要初始化s為0

19int

dx,dy;

20for(int i=0;i<2;i++)28}

29return dp[x][y][num][maxa+1]=s%n;30}

31int

main()37}

38 memset(dp,-1,sizeof(dp));

39 printf("

%d",dfs(1,1,0,-1

));40

return0;

41 }

這道題的方法就是記憶化搜尋

直接用搜尋會超時

以下是對**中/* */地方的注釋

/* 6 */ 解釋下dp陣列的意思,舉例說明 dp[3][4][5][6]=7 代表的意思是

當小明走到第3行第3列(從第0行第0列開始算)的格仔的時候,小明身上有5件寶貝,在這5件寶貝中,

價值最高的那件寶貝的價值是6,在這樣的情況下,小明走到終點拿到k件寶物的方案數是7

這也體現了記憶化搜尋的特點,因為我們要記錄在搜尋過程中的資訊,這個dp陣列記錄的資訊就是

位置,此時的寶貝數量,還有價值最高的寶貝的價值,這些資訊就足夠分明每一種情況,在這樣的情況下,

從這個格仔開始搜尋,得到的結果都是一樣的,那麼每種情況就只搜尋一次就行了,下次再遇到這種情況,

就直接用結果就行了

那麼為什麼要記錄最大值這個資訊呢,因為題目中有個條件是,當這個格仔裡的寶物的價值大於小明

手上拿的任意的寶物的價值的話,小明就可以拿走這個格仔裡的寶物,那麼當這個格仔裡的寶物大於小明

手上拿的最大價值的寶物的價值的話,這個格仔裡的寶物的價值就一定大於小明手上拿的任意的寶物的價值

記錄最大價值這條資訊就是為了方便判斷是否符合這個條件,否則你還得拿每乙個小明手中的寶物來和格仔裡

的寶物相比較,那樣太麻煩了。

在這裡還要說一下,**裡的dp陣列裡的第四維是maxa+1,為什麼這樣呢,因為最開始的時候我們設定的maxa的值為

-1,但-1是沒辦法做下標的,所以就加上了1,這樣就可以做下標了,所以其實dp[3][4][5][6]裡的意思是

在第三行第四列的格仔的時候,小明有5個寶貝,5個寶貝中的價值最大的寶貝的價值是6-1=5

那麼為什麼maxa一開始要設定為-1呢,其實在最一開始的時候,小明手中沒有寶物,那自然也沒有

最大價值這一說,所以任意乙個格仔裡的寶物的價值都大於此時一無所有的小明的手中寶物的價值

所以只要把maxa設成乙個比任何寶物的價值都小的數就行了,因為寶物的價值有可能是0

所以maxa設成0是不行的,又因為maxa還要做下標用,設成太小的數的話也不太好,比如說你

把maxa設定成-10086的話,此時maxa在當下標用的話,就得設成dp[x][y][num][maxa+10086]

這樣才能保證下標不出現負數,但這樣不就太麻煩了嘛,

藍橋杯 歷屆試題 地宮取寶

我本來想dp的 可惜dp不出來 後來才知道是記憶化搜尋 至於那個返回的max 1是因為 本來返回max 的 但是因為一開始代入dfs的引數是 1 所以就要 1 include include const int mod 1000000007 int a 51 51 int dp 51 51 13 1...

藍橋杯 歷屆試題 地宮取寶

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

藍橋杯 歷屆試題 地宮取寶

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