DP 地宮取寶(摘花生 最長上公升子串行變形)

2021-10-21 20:38:28 字數 1931 閱讀 4422

?原題鏈結

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陣列需要記錄座標位置

寶物價值需要越來越大才能拿;?需要記錄最後一次拿的寶物的價值

拿滿k件;?需要記錄件數

由此得出需要四位陣列來轉移狀態(分析時間複雜度發現很契合)

根據閆式dp分析法:

注意:dp問題一般都是從最後一步結果倒推來思考的。

#include

using

namespace std;

const

int n=

55,mod=

1000000007

;int n,m,k;

int w[n]

[n],f[n]

[n][13]

[14];

//f表示所有從起點走到(i,j),且已經取了k件物品,且最後一件物品價值是c的合法方案集合

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++

)//列舉各個座標}}

int res=0;

for(

int i=

1;i<=

13;i++

)//把從起點走到(n,m)處且取了k件的情況統計一下

res=

(res+f[n]

[m][k]

[i])

%mod;

cout<

return0;

}

Dp 最長上公升子串 最長上公升子串行

乙個數的子串bi,當b1 b2 bs的時候,我們稱這個子串是上公升的。對於給定的乙個序列 a1,a2,an 我們可以得到一些上公升的子串 ai1,ai2,aik 這裡1 i1 i2 ik n。如 對於序列 1,7,3,5,9,4,8 有它的一些上公升子串,如 1,7 3,5,9 等等。這些子串中最長...

最長上公升子串行(DP)

time limit 3000ms memory limit 65536k 有疑問?點這裡 乙個數的序列bi,當b 1 b 2 b s的時候,我們稱這個序列是上公升的。對於給定的乙個序列 a 1,a 2,a n 我們可以得到一些上公升的子串行 a i1,a i2,a ik 這裡1 i 1 i 2 i...

最長上公升子串行(Dp)

lis問題是最經典的動態規劃基礎問題之一。如果要求乙個滿足一定條件的最長上公升子串行,你還能解決嗎?給出乙個長度為n整數序列,請求出它的包含第k個元素的最長上公升子串行。例如 對於長度為6的序列 2,7,3,4,8,5 它的最長上公升子串行為 2,3,4,5 但如果限制一定要包含第2個元素,那滿足此...