第五屆藍橋杯C B組 地宮取寶

2021-09-12 12:33:39 字數 2543 閱讀 5445

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 , 不能通過工程設定而省略常用標頭檔案。

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

//地宮尋寶(超時)

#includeint n, m, k;

int data[55][55];

long long ans;//方案數

long long mod = 1000000007;

void dfs(int x, int y, int max, int count)

int cur = data[x][y];//當前物品價值

if (x == n - 1 && y == m - 1) }}

if (cur > max)

//對於價值小或者價值大,但是不取物品的情況

dfs(x, y + 1, max, count);

dfs(x + 1, y, max, count);

}int main()

}dfs(0, 0, -1, 0);//(座標x, 座標y, 最大值, 物品數)

// max取-1,因為第乙個點價值可能是0,但是可以取

printf("%lld\n", ans);

return 0;

}

參考**2(dfs優化,採用記憶型遞迴):

#include#includeint n, m, k;

int data[55][55];

typedef long long ll;

ll ans;//方案數

ll mod = 1000000007;

ll cache[55][55][15][15];

ll dfs2(int x, int y, int max, int count)

ll ans = 0;

if (x == n || y == m || count > k)

int cur = data[x][y];//當前物品價值

if (x == n - 1 && y == m - 1)

}return ans;

}if (cur > max)

//對於價值小或者價值大,但是不取物品的情況

ans += dfs2(x, y + 1, max, count);

ans += dfs2(x + 1, y, max, count);

cache[x][y][max + 1][count] = ans % mod;

return ans % mod;

}void dfs(int x, int y, int max, int count)

int cur = data[x][y];//當前物品價值

if (x == n - 1 && y == m - 1) }}

if (cur > max)

//對於價值小或者價值大,但是不取物品的情況

dfs(x, y + 1, max, count);

dfs(x + 1, y, max, count);

}int main()

}//dfs(0, 0, -1, 0);//(座標x, 座標y, 最大值, 物品數)

// max取-1,因為第乙個點價值可能是0,但是可以取

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

printf("%lld\n", dfs2(0, 0, -1, 0));

return 0;

}

地宮取寶 (第五屆藍橋杯省賽C A B組)

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

藍橋杯 2023年第五屆真題 地宮取寶

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

藍橋杯 2023年第五屆真題 地宮取寶

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