歷屆試題 地宮取寶 記憶化搜尋

2021-08-15 06:12:07 字數 1323 閱讀 6934

問題描述

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思路:

可以用dp[y][x][num][maxv]存經過點(y,x)並且在到達這個點之前已經拿了num個物品,且物品最大值為maxv的路徑總數。

注意:maxv是必須要記錄的,不然記憶化回溯的時候雖然這個點取num個物品有值,但是不知道已經記錄的取法中取的物品是否大於當前手裡的物品。

由於物品的值可能為0,所以maxv存的時候要+1。每次搜尋的時候需要搜尋兩次,取和不取。

終止條件為:

走到最後乙個點

1、如果手裡已經有k個物品,則返回1;

2、如果手裡有k-1個物品,並且能夠取最後一件物品,返回1;

3、否則返回0;

**:#include#include#include#include#include#includeusing namespace std;

#define mod 1000000007

int n,m,k,g[55][55];

int dp[55][55][15][15];

int dir[2][2]=;

int dfs(int y,int x,int num,int maxv)

int s=0;

for(int i=0;i<2;i++)

{int ty=y+dir[i][0];

int tx=x+dir[i][1];

if(ty>=n || tx>=m)

continue;

if(g[y][x]>maxv && num

歷屆試題 地宮取寶 dfs 記憶化

歷屆試題 地宮取寶 時間限制 1.0s 記憶體限制 256.0mb 問題描述 x 國王有乙個地宮寶庫。是 n x m 個格仔的矩陣。每個格仔放一件寶貝。每個寶貝貼著價值標籤。地宮的入口在左上角,出口在右下角。小明被帶到地宮的入口,國王要求他只能向右或向下行走。走過某個格仔時,如果那個格仔中的寶貝價值...

歷屆試題 地宮取寶 (dfs 記憶化)

時間限制 1.0s 記憶體限制 256.0mb 問題描述 x 國王有乙個地宮寶庫。是 n x m 個格仔的矩陣。每個格仔放一件寶貝。每個寶貝貼著價值標籤。地宮的入口在左上角,出口在右下角。小明被帶到地宮的入口,國王要求他只能向右或向下行走。走過某個格仔時,如果那個格仔中的寶貝價值比小明手中任意寶貝價...

記憶化搜尋 地宮取寶

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