地宮取寶
時間限制:1.0s 記憶體限制:256.0mb
問題描述
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 查詢
當資料大時會超時 得分42
#include
#include
#include
using
namespace std;
int n, m, k;
int map[55]
[55];
int ans =0;
void
dfs(
int x,
int y,
int maxx,
int cnt)}if
(val > maxx)
dfs(x, y +
1, maxx, cnt)
;dfs
(x +
1, y, maxx, cnt);}
intmain()
改進遞迴:記憶性遞迴
#include
#include
#include
#include
using
namespace std;
int n, m, k;
int map[55]
[55];
long
long mem[55]
[55][
20][20
];long
long
dfs(
int x,
int y,
int maxx,
int cnt)
return ans;}if
(val > maxx)
ans +
=dfs
(x, y +
1, maxx, cnt)
; ans +
=dfs
(x +
1, y, maxx, cnt)
; mem[x]
[y][maxx+1]
[cnt]
= ans %
1000000007
;return mem[x]
[y][maxx+1]
[cnt];}
intmain()
藍橋杯 地宮取寶 (記憶化搜尋)
思路 記憶化搜尋,dp x y curmax num 記錄的是要取 x,y 位置時,拿了num個物品,其中最大價值為curmax的 時 候的方案數量。注意有個坑點,物品價值可能為0,搜尋時我們初始價值為0,但第乙個價值為0的物品是可以取的,所以我們讀入時 講 所有物品價值 1.include inc...
藍橋杯 地宮取寶
x 國王有乙個地宮寶庫,是 n m 個格仔的矩陣,每個格仔放一件寶貝,每個寶貝貼著價值標籤。地宮的入口在左上角,出口在右下角。小明被帶到地宮的入口,國王要求他只能向右或向下行走。走過某個格仔時,如果那個格仔中的寶貝價值比小明手中任意寶貝價值都大,小明就可以拿起它 當然,也可以不拿 當小明走到出口時,...
記憶化遞迴 地宮取寶
x 國王有乙個地宮寶庫。是 n x m 個格仔的矩陣。每個格仔放一件寶貝。每個寶貝貼著價值標籤。地宮的入口在左上角,出口在右下角。小明被帶到地宮的入口,國王要求他只能向右或向下行走。走過某個格仔時,如果那個格仔中的寶貝價值比小明手中任意寶貝價值都大,小明就可以拿起它 當然,也可以不拿 當小明走到出口...