藍橋杯 歷屆試題 地宮取寶

2021-08-17 09:50:15 字數 1308 閱讀 9605

問題描述

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

需要的是記錄狀態的dfs,這裡我們使用乙個四維的陣列,來記錄一下到這個點擁有寶物數量以及最大寶物價值的狀態下,有幾條路徑能夠通達這裡,如果下一次遍歷的這樣的乙個狀態的話,直接返回現在的數值就好,這裡的記錄狀態實質就是普遍dfs中的vis陣列(記錄有沒有走過這裡)

#include #include #include #include #include #include #include #include #define inf 0x3f3f3f3f

using namespace std;

typedef long long ll;

const int mod = 1000000007;

const int maxn = 55;

ll flag[maxn][maxn][300][15];

ll n,m,k;

ll dfs(int x,int y,int num,int max_v)

if(x == n-1 && y == m-1)

else

}if( x+1 < n)

if( y+1 < m)

flag[x][y][num][max_v+1] = s % mod;

return flag[x][y][num][max_v+1];

}void init()

void solve()

int main()

藍橋杯 歷屆試題 地宮取寶

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

藍橋杯 歷屆試題 地宮取寶

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

藍橋杯 歷屆試題 地宮取寶

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