藍橋杯 2023年第五屆真題 地宮取寶

2021-10-22 16:51:18 字數 1915 閱讀 5734

題目描述

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 3 2

1 2 3

2 1 5

樣例輸出

14
題意分析:有乙個用二維陣列表示的地宮,每乙個格仔處放著乙個寶貝,小明從地宮左上角出發,到地宮右下角離開地宮的途中可以(也可以不拿)拿起格仔中的寶物(當前格仔的寶物價值高於小明手裡任意一件寶物的價值),並且小明只能往下走或者往右走,如果離開地宮是小明手中的寶物正好是k件時認為是乙個有效的行動方案,現在求所有有效行動方案的數量。 

思路分析:

1.僅使用dfs,只用dfs會超時。從出發點開始使用dfs,因為只能往下走或者往右走所以不存在走回來的情況,不需要使用標記陣列,在每個格仔處如果當前格仔裡的寶物價值比小明手裡任意一件寶物的價值都要大,此時小明有兩種選擇,一是拿起這個寶物,二是不拿這個寶物,當小明走到地宮出口時,小明手裡寶物為k件,有效行動方案計數加一。

2.使用dfs+記憶化搜尋。小明的狀態有四個維度分別是x座標、y座標、當前手中的寶物數量和手中寶物價值中的最大值。所以,要想記錄某個格仔下小明的有效方案數不僅要記錄格仔的位置,還要記錄當前手中的寶物數量和手中寶物價值中的最大值,因此使用乙個四位維陣列dp來儲存有效方案數。四位陣列中的每乙個單位儲存的是當前狀態(x,y,num,maxvalue)下的有效方案數。詳細思路見**.

這裡還有乙個易錯點:

寶物中有價值為0的寶物,所以初始dfs時maxvalue需設定為-1,但是這樣的話,dp陣列就會陣列越界,所以在儲存有效方案數時,令每個狀態下的maxvalue加一,這樣最後dp[1][1][0][0]裡存的就是總有效方案數。

#includeusing namespace std;

int n,m,k;

int mp[55][55];

const int q = 1000000007;

int dx = ;

int dy = ;

long long dp[55][55][13][13];//儲存每種狀態(x,y,num,maxvalue)下的有效方案數

long long dfs(int x,int y,int num,int maxvalue)

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

else

}long long s=0;

for(int i=0; i<2; i++)

s += dfs(newx,newy,num,maxvalue)%q;}}

//記錄當前狀態的有效方案數

dp[x][y][num][maxvalue+1] = s%q;

return s%q;

}int main()

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

cout

}

藍橋杯 2023年第五屆真題 地宮取寶

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

藍橋杯 2023年第五屆真題 分糖果

問題描述 有n個小朋友圍坐成一圈。老師給每個小朋友隨機發偶數個糖果,然後進行下面的遊戲 每個小朋友都把自己的糖果分一半給左手邊的孩子。一輪分糖後,擁有奇數顆糖的孩子由老師補給1個糖果,從而變成偶數。反覆進行這個遊戲,直到所有小朋友的糖果數都相同為止。你的任務是 在已知的初始糖果情形下,老師一共需要補...

藍橋杯 2023年第五屆真題 分糖果

時間限制 1sec 記憶體限制 128mb 提交 5184 解決 2783 題目描述 問題描述 有n個小朋友圍坐成一圈。老師給每個小朋友隨機發偶數個糖果,然後進行下面的遊戲 每個小朋友都把自己的糖果分一半給左手邊的孩子。一輪分糖後,擁有奇數顆糖的孩子由老師補給1個糖果,從而變成偶數。反覆進行這個遊戲...