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這是一道動態規劃的題目。我們可以用yxc的集合方法來分析動態規劃。可以用dp[i][j][k][l]來表示,從起點到(i,j)點時,取得物品的數量為k,且最後一件取得的物品價值為l的方案數量,通過分析,我們可以發現,走到最後一步的方案數等於最後一步是從上走下來的方案數和最後一步是從左走過來的方案數相加,而最後一步又有取和不取兩種情況,如果不取最後一件的話,那麼狀態方程很容易表示出來;如果取最後一件,則會比較複雜。根據題意,我們每次所取的最後一件一定是最大的,所以我們一定會有乙個限定條件,即w==g[i][j],如果滿足這個條件,那麼就再進行一次迴圈,將方案數相加即可。關於細節問題,由於我們要選的是方案數,所以與物品價值大小無關。如果選第一件物品,則有初值dp[1][1][1][g[1][1]]=1。如果不選,則有dp[1][1][0][0]=1。
#include
using
namespace std;
const
int n=55;
const
int mod=
1e9+7;
int dp[n]
[n][13]
[14];
int g[n]
[n];
int n,m,k;
intmain()
} dp[1]
[1][
1][g[1][
1]]=
1;dp[1]
[1][
0][0
]=1;
for(
int i=
1;i<=n;i++)}
}}}}
int res=0;
for(
int i=
0;i<=
13;i++
) res=
(res+dp[n]
[m][k]
[i])
%mod;
cout
}
第五屆藍橋杯C B組 地宮取寶
x 國王有乙個地宮寶庫。是 n x m 個格仔的矩陣。每個格仔放一件寶貝。每個寶貝貼著價值標籤。地宮的入口在左上角,出口在右下角。小明被帶到地宮的入口,國王要求他只能向右或向下行走。走過某個格仔時,如果那個格仔中的寶貝價值比小明手中任意寶貝價值都大,小明就可以拿起它 當然,也可以不拿 當小明走到出口...
藍橋杯 2023年第五屆真題 地宮取寶
題目描述 x 國王有乙個地宮寶庫。是 n x m 個格仔的矩陣。每個格仔放一件寶貝。每個寶貝貼著價值標籤。地宮的入口在左上角,出口在右下角。小明被帶到地宮的入口,國王要求他只能向右或向下行走。走過某個格仔時,如果那個格仔中的寶貝價值比小明手中任意寶貝價值都大,小明就可以拿起它 當然,也可以不拿 當小...
藍橋杯 2023年第五屆真題 地宮取寶
x 國王有乙個地宮寶庫。是 n x m 個格仔的矩陣。每個格仔放一件寶貝。每個寶貝貼著價值標籤。地宮的入口在左上角,出口在右下角。小明被帶到地宮的入口,國王要求他只能向右或向下行走。走過某個格仔時,如果那個格仔中的寶貝價值比小明手中任意寶貝價值都大,小明就可以拿起它 當然,也可以不拿 當小明走到出口...