地宮取寶
問題描述
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記錄位數,...