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
#include
#include
#include
using
namespace std;
const
int maxn =50+
5;const
int maxk =15;
const
int mod =
1000000007
;int n, m, k, ans =0;
int map[maxn]
[maxn]
;long
long dp[maxn]
[maxn]
[maxk]
[maxk]
;long
long
dfs(
int r,
int c,
int maxv,
int cnt)
if(r == n && c == m && cnt == k)
sum =
(sum +
dfs(r +
1, c, maxv, cnt)
% mod)
% mod;
sum =
(sum +
dfs(r, c +
1, maxv, cnt)
% mod)
% mod;
if(map[r +1]
[c]> maxv) sum =
(sum +
dfs(r +
1, c, map[r +1]
[c], cnt +1)
% mod)
% mod;
if(map[r]
[c +1]
> maxv) sum =
(sum +
dfs(r, c +
1, map[r]
[c +1]
, cnt +1)
% mod)
% mod;
return dp[r]
[c][maxv]
[cnt]
= sum;
}int
main()
} ans =
(dfs(1
,1,-
1,0)
+dfs(1
,1, map[1]
[1],
1))% mod;
cout << ans << endl;
return0;
}
記憶化搜尋 地宮取寶
問題描述 x 國王有乙個地宮寶庫。是 n x m 個格仔的矩陣。每個格仔放一件寶貝。每個寶貝貼著價值標籤。地宮的入口在左上角,出口在右下角。小明被帶到地宮的入口,國王要求他只能向右或向下行走。走過某個格仔時,如果那個格仔中的寶貝價值比小明手中任意寶貝價值都大,小明就可以拿起它 當然,也可以不拿 當小...
地宮取寶(記憶化搜尋)
x 國王有乙個地宮寶庫。是 n x m 個格仔的矩陣。每個格仔放一件寶貝。每個寶貝貼著價值標籤。地宮的入口在左上角,出口在右下角。小明被帶到地宮的入口,國王要求他只能向右或向下行走。走過某個格仔時,如果那個格仔中的寶貝價值比小明手中任意寶貝價值都大,小明就可以拿起它 當然,也可以不拿 當小明走到出口...
記憶化遞迴 地宮取寶
x 國王有乙個地宮寶庫。是 n x m 個格仔的矩陣。每個格仔放一件寶貝。每個寶貝貼著價值標籤。地宮的入口在左上角,出口在右下角。小明被帶到地宮的入口,國王要求他只能向右或向下行走。走過某個格仔時,如果那個格仔中的寶貝價值比小明手中任意寶貝價值都大,小明就可以拿起它 當然,也可以不拿 當小明走到出口...