基礎演算法題 地宮取寶(深搜 剪枝)

2021-10-04 12:41:51 字數 1672 閱讀 1972

地宮取寶

問題描述

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題目大同小異,做題基本思路:遞迴+剪枝

細節問題:

拿寶物條件:格仔中的寶貝價值比小明手中任意寶貝價值都大才能拿。

如何設定cache陣列:與描述dfs狀態的變數相匹配,並將元素全部置為-1。寶物價值:0<=ci<=12,若cache陣列元素全部置為0的話,則會遺漏取價值為0的寶物的路徑。

如何設定沒拿寶物時max的值:初始化max=-1。寶物價值:0<=ci<=12,一開始沒拿寶物不能有max=0,否則會遺漏取價值為0的寶物的路徑。(注意:max等於負數cache陣列的下標不能為負數,要計作max+1,同時cache陣列記錄max的下標上限要加1,因為當max=12時,max+1=13)

#include

using namespace std;

int bk[55]

[55], n, m, k;

int cache[55]

[55][

14][13

];//記憶路徑,防止重複,剪枝

const

long

long mod=

1e9+7;

long

long

dfs(

int n1,

int m1,

int max,

int k1)

//不拿

ans+

=dfs

(n1+

1, m1, max, k1)

; ans+

=dfs

(n1, m1+

1, max, k1)

;//拿

if(bk[n1]

[m1]

>max)

cache[n1]

[m1]

[max+1]

[k1]

=ans%mod;

return ans%mod;

}int

main()

該題具有一般性,比較適合作為一道深搜模板題。

東華oj 挑戰題第74題 地宮取寶

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

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

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

求m可以被n整除的數 深搜剪枝題

給乙個數n,讓你找出乙個只由0,和1組成的十進位制數m,要求這個正整數m可以被n整除.輸入格式 輸入乙個整數n 1 n 200 輸出格式 對於輸入整數n的每乙個值,輸出m的相應值,保證有乙個 數字長度小於19位的數字.如果有乙個給定值n有多個解,其中任何乙個都是可以接受的.題解 乙個cnt記錄位數,...