地宮取寶
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
程式應該輸出:
思路及分析:
1:當題目說只能向下或向右走的時候,就發現是乙個熟悉的套路,妥妥的乙個dp題,剛開始dp時,覺得是乙個三維的dp題,後來發現題目還有乙個限制,就是物品的價值,如果當前的物品的價值大於前面所有的價值,就可以拿起,意味著拿起的物體是遞增的,另外注意到物品的價值非常小,那麼又要增加乙個維度,乙個4維的陣列。
2:dp的狀態表示:
f[i][j][u][v]表示當前走到第i行第j列的格仔(前面已經走好了,不管情況怎樣)已經選了u個物品,且最大價值是v的方案 數。
dp的狀態轉移:
當前的格仔由左邊和上邊的格仔轉化來的,而當前的格仔有兩種方案數,一種是當前格仔的物品,另一種是選。
對於不選的情況:
左邊的格仔的方案數:f[i][j-1][u][v] 上邊的格仔的方案數:f[i-1][j][u][v]
對於選的情況:
左邊的格仔的方案數:f[i][j-1][u-1][c] 上邊的格仔的方案數:f[i-1][j][u-1][c] 其中0<=c#include
using
namespace std;
const
int n=
55,mod=
1e9+7;
int w[n]
[n]=
;int f[n]
[n][13]
[14]=
;long
long res=0;
intmain()
f[1][
1][1
][w[1]
[1]]
=1; f[1]
[1][
0][0
]=1;
for(
int i=
1;i<=n;i++
)for
(int j=
1;j<=m;j++)}
}}}for
(int i=
0;i<=
13;i++
) res=
(res+f[n]
[m][k]
[i])
%mod;
cout }注意方案數要取模! 而且這兩種寫法有區別:res=
(res+f[n]
[m][k]
[i])
%mod;
res+
=f[n]
[m][k]
[i]%mod;
藍橋杯 地宮取寶 DP
問題描述 x 國王有乙個地宮寶庫。是 n x m 個格仔的矩陣。每個格仔放一件寶貝。每個寶貝貼著價值標籤。地宮的入口在左上角,出口在右下角。小明被帶到地宮的入口,國王要求他只能向右或向下行走。走過某個格仔時,如果那個格仔中的寶貝價值比小明手中任意寶貝價值都大,小明就可以拿起它 當然,也可以不拿 當小...
藍橋杯 地宮取寶 dp
歷屆試題 地宮取寶 時間限制 1.0s 記憶體限制 256.0mb 問題描述 x 國王有乙個地宮寶庫。是 n x m 個格仔的矩陣。每個格仔放一件寶貝。每個寶貝貼著價值標籤。地宮的入口在左上角,出口在右下角。小明被帶到地宮的入口,國王要求他只能向右或向下行走。走過某個格仔時,如果那個格仔中的寶貝價值...
歷屆試題 地宮取寶
歷屆試題 地宮取寶 時間限制 1.0s 記憶體限制 256.0mb 提交此題 問題描述 x 國王有乙個地宮寶庫。是 n x m 個格仔的矩陣。每個格仔放一件寶貝。每個寶貝貼著價值標籤。地宮的入口在左上角,出口在右下角。小明被帶到地宮的入口,國王要求他只能向右或向下行走。走過某個格仔時,如果那個格仔中...