45 藍橋杯之地宮取寶(程式設計題)

2021-10-04 22:16:07 字數 2011 閱讀 2623

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 取模的結果。

例如,輸入:22

2122

1程式應該輸出:

2再例如,輸入:23

2123

215程式應該輸出:

14

#include

using namespace std;

const int mod =

1000000007

;int ans =0;

int n,m,k;

int data[50]

[50];

void dfs(

int x,

int y,

intmax

,int cnt)

}// 遞迴條件

if(cur>

max)

// 對於價值較小,或者價值大但不取這個物品的情況如下

dfs(x,y+1,

max,cnt)

; dfs(x+

1,y,

max,cnt);}

int main(

)

dfs的時候最初應設定為-1,而不是0.

dfs(0,

0,-1

,0);

//因為第乙個點的價值可能是0,所以第乙個點不是是0

n,m設為是全域性變數,在遞迴的時候就可以減少引數傳遞

設定陣列引數int data[50][50];為全域性變數

在dfs函式中,在遞迴條件中分為兩種情況,第一種是,當前格仔的價值大於max並且取這個物品

if

(cur>

max)

第二種是,當前價值小於max,或者大於了max但是不取這個物品

//	對於價值較小,或者價值大但不取這個物品的情況如下

dfs(x,y+1,

max,cnt)

; dfs(x+

1,y,

max,cnt)

;

ans++的情況。首先我們來分析什麼時候可以ans++。必須在最後乙個格仔的時候,即if(x==n-1&&y==m-1)。其次,在cnt==k。還有種容易忽略的情況是,在最後乙個格仔cnt = k-1,但是當前價值大於max。即 cnt = k-1&&cur>max

上面這種題解在量大的時候會超時。如果在比賽時,只為拿部分的分,這一題就並不算難。設定n,m,k等資料為全域性變數,也好方便遞迴函式少傳引數。然後輸入陣列資料,運用dfs函式遞迴求解。其中,dfs初始化的時候,max初始化為-1,而不是0。因為存在第乙個要取的格仔為0,要取這個0的情況。

在dfs函式中,遞迴情況,分為當前cur>max且要取的情況,另一種是cur>max不取或curif

(x==n-1&

&y==m-1)

//已經面臨最後乙個格仔

}即站在最後乙個格仔,最後乙個格仔的價值不取,且cnt=k

或是站在最後乙個格仔,剛好最後乙個格仔的價值可以取,而且cnt==k-1還缺乙個數量才能到k

藍橋杯 地宮取寶

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

藍橋杯程式設計大題 地宮取寶

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

藍橋杯 地宮取寶 DP

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