地宮尋寶(記憶化所搜)

2021-07-30 04:40:22 字數 1433 閱讀 2971

地宮尋寶

題目描述:

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

#include#include#include#include#define max 1000000007

using namespace std;

int dp[105][105][105][105];//假設這四個分別為x,y,sum,max,則x,y表示座標,sum表示拿寶貝的件數,max表示手中所拿的寶貝的最大價值

int n,m,k;

int map[105][105];//地圖

int dfs(int x,int y,int sum,int s)//假設這四個分別為x,y,sum,s,則x,y表示座標,sum表示拿寶貝的件數,s表示手中所拿的寶貝的最大價值

else if(sum==k)

t++;

return dp[x][y][sum][s+1]=t;

}//向右走

if(x+1s)

t=t+dfs(x+1,y,sum,s);

t=t%max;

}//向左走

if(y+1s)

t=t+dfs(x,y+1,sum,s);

t=t%max;

}dp[x][y][sum][s+1]=t;

return dp[x][y][sum][s+1];

}int main()

{ scanf("%d%d%d",&n,&m,&k);

for(int i=0;i>map[i][j];

memset(dp,-1,sizeof(dp));

dp[0][0][0][0]=dfs(0,0,0,-1);

cout<

藍橋 地宮尋寶 記憶化搜尋

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

記憶化搜尋 地宮取寶

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

地宮取寶(記憶化搜尋)

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