藍橋杯 地宮取寶

2021-10-21 05:00:17 字數 2073 閱讀 6341

x 國王有乙個地宮寶庫,是 n×m 個格仔的矩陣,每個格仔放一件寶貝,每個寶貝貼著價值標籤。

地宮的入口在左上角,出口在右下角。

小明被帶到地宮的入口,國王要求他只能向右或向下行走。

走過某個格仔時,如果那個格仔中的寶貝價值比小明手中任意寶貝價值都大,小明就可以拿起它(當然,也可以不拿)。

當小明走到出口時,如果他手中的寶貝恰好是 k 件,則這些寶貝就可以送給小明。

請你幫小明算一算,在給定的局面下,他有多少種不同的行動方案能獲得這 k 件寶貝。

輸入格式

第一行 3 個整數,n,m,k,含義見題目描述。

接下來 n 行,每行有 m 個整數 ci 用來描述寶庫矩陣每個格仔的寶貝價值。

輸出格式

輸出乙個整數,表示正好取 k 個寶貝的行動方案數。

該數字可能很大,輸出它對 1000000007 取模的結果。

資料範圍

1≤n,m≤50,

1≤k≤12,

0≤ci≤12

輸入樣例1:

2 2 2

1 22 1

輸出樣例1:

2輸入樣例2:

2 3 2

1 2 3

2 1 5

輸出樣例2:

14解題思路:

首先我們定義dp[i][j][cnt][k]表示小明從左上角走到(i,j)拿了cnt個物品且手上最大價值為k的走法,在這道題當中價值的範圍為(0,12),意思就是在地圖的各個點的物品都有可能價值是0,所以我們在讀入資料的時候,將每個資料都+1,這樣價值的範圍就變成了(1,13),方便我們考慮初始化問題,然後我們想想關係表示式,在這個點可以取或者不取,不取的話,**如下:

dp[i]

[j][cnt]

[v]=

(dp[i]

[j][cnt]

[v]+ dp[i -1]

[j][cnt]

[v])

% mod;

dp[i]

[j][cnt]

[v]=

(dp[i]

[j][cnt]

[v]+ dp[i]

[j -1]

[cnt]

[v])

% mod;

這裡要分開寫,而且結果要%mod,不然會爆資料,然後小明每次取的物品比前面的物品都要大,然後,如果這個點的物品能取,一定符合:

這個點物品的價值等於我們dp[i][j][cnt][k]中的k值,而且如果取物品,那麼cnt一定大於0,然後我們要考慮怎麼初始化,在起點,小明有可能拿這個物品,也有可能不拿這個物品,所以不拿就是dp[1][1][0][0] = 1,拿這個物品dp[1][1][1][w[1][1]]

**如下:

#include

using

namespace std;

const

int n =55;

const

int mod =

1000000007

;int dp[n]

[n][15]

[15];

int w[n]

[n];

int n, m, k;

intmain()

dp[1]

[1][

0][0

]=1;

dp[1]

[1][

1][w[1][

1]]=

1;for(

int i =

1; i <= n; i++

)for

(int j =

1; j <= m; j++

)for

(int cnt =

0; cnt <= k; cnt++

)for

(int v =

0; v <=

13; v++)}

}int res =0;

for(

int i =

0; i <=

13; i++

) cout << res << endl;

return0;

}

藍橋杯 地宮取寶 DP

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

藍橋杯 地宮取寶 dp

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

藍橋杯 地宮取寶(12 )

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