PREV 28 地宮取寶(DP)

2021-10-06 08:40:03 字數 3175 閱讀 8628

題目傳送門

題解思路參考大佬

題解思路參考大佬

題解思路參考大佬

x 國王有乙個地宮寶庫。是 n×m

n \times m

n×m 個格仔的矩陣。每個格仔放一件寶貝。每個寶貝貼著價值標籤。

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

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

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

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

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

kk 件寶貝。

輸入格式

輸入一行 3 個整數,用空格分開:nnnm

mmkkk

接下來有 n

nn 行資料,每行有 m

mm 個整數 ci(

0<=c

i<=12

)c_i (0 <= c_i <= 12)

ci​(

0<=c

i​<=1

2)代表這個格仔上的寶物的價值

輸出格式

要求輸出乙個整數,表示正好取 k

kk 個寶貝的行動方案數。該數字可能很大,輸出它對 1000000007

1000000007

100000

0007

取模的結果。

資料範圍1

<=n

,m

<=50

,1

<=k

<=12

1<=n, m<=50, 1<=k<=12

1<=n

,m<=5

0,1<=k

<=1

2 輸入輸出樣例

樣例輸入1

2 2 2

1 22 1

樣例輸出1

2
樣例輸入2

2 3 2

1 2 3

2 1 5

樣例輸出2

14
dp。給定乙個 n×m

n \times m

n×m 圖,圖中每個點都有乙個不同價值的物品,從左上角出發到右下角,每次只能向右或向下行一步,對所到達的點上的物品,若當前點的物品大於任意乙個已取得的物品,可以選擇拿或不拿。求到達右下角時,恰好拿到k個物品的方案數。

因為題目中要求了每次拿的物品價值必須是遞增的,所以當前手上所有物品中價值最大的一定是在最後乙個點處取得的物品,且後面拿的物品一定比前乙個的物品價值大。

狀態表示:我們用f[i][j][u][v]表示在點(i,j)已取得 u 個物品,且其中當前手上物品中的最大價值為 v。

狀態計算:按照最後一步(即點(i,j)處)的取法可分為四種情況:

+1偏移量,因為價值ci(

0<=c

i<=12

)c_i (0 <= c_i <= 12)

ci​(

0<=c

i​<=1

2),而我們一開始不選擇的時候f[i][j][u][v],此時v存在不選擇的情況,則我們可以填寫比0小的數字-1;

但因為-1無法做陣列下標,直接對所有價值全部加1,就變成了1到13,原有的0就可以作為不選擇的下標了。

初始化邊界條件,在(1,1)點處有兩種情況——拿或不拿,其實對於這兩種情況的方案數都是1。如果不拿,那麼就是獲得0個物品這1種方案;如果拿了,那麼就是只能獲得(1,1)點處的物品,當前最大價值為map[1][1]這1種方案。即f[1][1][0][0] = f[1][1][1][map[1][1]] = 1;

因為每次只能不斷拿比之前價值更大的物品,所以假如這次拿了的話,這次拿的物品一定是最大的,因此只能是v==g[i][j]的時候才符合這個意義。

舉個反例,假如x!=a[i][j]f[i][j][u][x]表示:在 (i,

j)

(i,j)

(i,j

) 這個點,拿了 u

uu 個物品,這些物品中價值最大的是 x

xx,但 (x,

y)

(x,y)

(x,y

) 這個點的物品的價值為g[i][j]才對,這是不符合一開始的陣列定義的。

#include

#include

using

namespace std;

const

int n =60;

const

int k =20;

const

int mod =

1e9+7;

int n, m, k, res, g[n]

[n], f[n]

[n][k]

[k];

intmain()

f[1]

[1][

0][0

]= f[1]

[1][

1][g[1][

1]]=

1;for(

int i =

1; i <= n; i++

)for

(int j =

1; j <= m; j++

)for

(int u =

0; u <= k; u++

)for

(int v =

0; v < k; v++)}

}for

(int i =

1; i < k; i++

)//最後把在點(n,m)處拿k個物品的方案數累加起來。

res =

(res + f[n]

[m][k]

[i])

% mod;

printf

("%d"

, res)

;return0;

}

藍橋杯 PREV 28 地宮取寶 DFS

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

藍橋2014 9 地宮取寶

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

地宮取寶 多維DP

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