地宮取寶 C DFS 記憶化

2021-10-01 05:14:34 字數 1784 閱讀 7750

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