地宮取寶 多維DP

2021-10-02 02:19:06 字數 1863 閱讀 8598

地宮取寶

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 個格仔的矩陣。每個格仔放一件寶貝。每個寶貝貼著價值標籤。地宮的入口在左上角,出口在右下角。小明被帶到地宮的入口,國王要求他只能向右或向下行走。走過某個格仔時,如果那個格仔中...