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