地宮取寶(記憶化搜尋)

2021-09-12 11:16:30 字數 1637 閱讀 8809

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資源約定:

峰值記憶體消耗 < 256m

cpu消耗  < 1000ms

請嚴格按要求輸出,不要畫蛇添足地列印類似:「請您輸入...」 的多餘內容。

所有**放在同乙個原始檔中,除錯通過後,拷貝提交該原始碼。

注意: main函式需要返回0

注意: 只使用ansi c/ansi c++ 標準,不要呼叫依賴於編譯環境或作業系統的特殊函式。

注意: 所有依賴的函式必須明確地在原始檔中 #include , 不能通過工程設定而省略常用標頭檔案。

提交時,注意選擇所期望的編譯器型別。

思路一:直接深搜,但是會超時

**:

#include#include#includeusing namespace std;

#define mod 1000000007

typedef long long ll;

int n,m,k;

ll cnt=0;

int price[55][55];

//maxx為最大價值,sk為物品數量

void dfs(int x,int y,int maxx,int sk)

dfs(x+1,y,maxx,sk);

} if(y+1maxx)

dfs(x,y+1,maxx,sk); }}

int main()

cnt+=dfs(x+1,y,maxx,sk);

cnt%=mod;

} if(y+1maxx)

cnt+=dfs(x,y+1,maxx,sk);

cnt%=mod;

} dp[x][y][maxx+1][sk]=cnt;

return dp[x][y][maxx+1][sk];

}int main()

memset(dp,-1,sizeof(dp)); //表示未搜尋的狀態

dp[0][0][0][0]=dfs(0,0,-1,0); //maxx初始值為-1 因為寶物價值有可能為0

cout

}

記憶化搜尋 地宮取寶

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

藍橋杯 地宮取寶 (記憶化搜尋)

思路 記憶化搜尋,dp x y curmax num 記錄的是要取 x,y 位置時,拿了num個物品,其中最大價值為curmax的 時 候的方案數量。注意有個坑點,物品價值可能為0,搜尋時我們初始價值為0,但第乙個價值為0的物品是可以取的,所以我們讀入時 講 所有物品價值 1.include inc...

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

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