国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

藍橋杯第五屆 地宮取寶 (四維線性dp)

2019-11-10 20:41:22
字體:
來源:轉載
供稿:網友
  問題描述  X 國王有一個地宮寶庫。是 n x m 個格子的矩陣。每個格子放一件寶貝。每個寶貝貼著價值標簽?! 〉貙m的入口在左上角,出口在右下角。  小明被帶到地宮的入口,國王要求他只能向右或向下行走?! ∽哌^某個格子時,如果那個格子中的寶貝價值比小明手中任意寶貝價值都大,小明就可以拿起它(當然,也可以不拿)。  當小明走到出口時,如果他手中的寶貝恰好是k件,則這些寶貝就可以送給小明?! ≌埬銕托∶魉阋凰?,在給定的局面下,他有多少種不同的行動方案能獲得這k件寶貝。輸入格式  輸入一行3個整數,用空格分開:n m k (1<=n,m<=50, 1<=k<=12)  接下來有 n 行數據,每行有 m 個整數 Ci (0<=Ci<=12)代表這個格子上的寶物的價值輸出格式  要求輸出一個整數,表示正好取k個寶貝的行動方案數。該數字可能很大,輸出它對 1000000007 取模的結果。樣例輸入2 2 21 22 1樣例輸出2樣例輸入2 3 21 2 32 1 5樣例輸出14題目分析:數據量不大,考慮用四維dp,dp[i][j][ma][num]表示到點(i,j)時最大值為ma取得了num個寶貝的方法數,對于某個點如果它的寶藏值大于當前最大值,則我們可以取也可以不取,否則我們只能不取,因此轉移方程:if(ma < val[i][j])  dp[i] [j] [ val[i][j] ] [num + 1] = (dp[i] [j] [ val[i][j] ] [num + 1] + dp[i - 1] [j] [ma] [num] + dp[i] [j - 1] [ma] [num]) % MOD //取dp[i] [j] [ma] [num] = (dp[i] [j] [ma] [num] +dp[i - 1] [j] [ma] [num] + dp[i] [j - 1] [ma] [num]) % MOD //不取 (這里沒有else,因為不論我們能不能取,我們都可以選擇不取),最后我們只要累加dp[n][m][各最大值][k]的值即可,初始dp[1][1][val[1][1]][1] = 1第一個點取,dp[1][1][0][0]第一點不取這題還有兩個坑點,第一:上述轉移方程要分成兩段寫,因為是對1e9+7取模,我們考慮最壞的情況,括號里的數就可能超int。第二:寶物的價值有可能是0,因為初始化為0,因此混淆了空的點和價值為0的點,因此我們讓每個寶藏的價值自增1
#include <cstdio>#include <cstring>#define MOD 1000000007int dp[55][55][15][15];int val[55][55];int main(){    int n, m, k;    scanf("%d %d %d", &n, &m, &k);    for(int i = 1; i <= n; i++)    {        for(int j = 1; j <= m; j++)        {            scanf("%d", &val[i][j]);            val[i][j] ++;        }    }    memset(dp, 0, sizeof(dp));    dp[1][1][val[1][1]][1] = 1;    dp[1][1][0][0] = 1;    for(int i = 1; i <= n; i++)    {        for(int j = 1; j <= m; j++)        {            if(i == 1 && j == 1)                continue;            for(int num = 0; num <= k; num++)            {                for(int ma = 0; ma <= 13; ma++)                {                    if(ma < val[i][j])                    {                        dp[i][j][val[i][j]][num + 1] = (dp[i][j][val[i][j]][num + 1] + dp[i - 1][j][ma][num]) % MOD;                        dp[i][j][val[i][j]][num + 1] = (dp[i][j][val[i][j]][num + 1] + dp[i][j - 1][ma][num]) % MOD;                        }                    dp[i][j][ma][num] = (dp[i][j][ma][num] + dp[i - 1][j][ma][num]) % MOD;                    dp[i][j][ma][num] = (dp[i][j][ma][num] + dp[i][j - 1][ma][num]) % MOD;                }            }        }    }    int ans = 0;    for(int i = 0; i < 13; i++)        ans = (ans + dp[n][m][i][k]) % MOD;    PRintf("%d/n", ans);}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 泽普县| 宁南县| 保亭| 玛纳斯县| 甘肃省| 徐州市| 庆城县| 凌源市| 增城市| 元氏县| 如皋市| 五河县| 伊金霍洛旗| 宜宾市| 光山县| 桓台县| 闻喜县| 普兰县| 长岛县| 玉树县| 岑巩县| 萨嘎县| 湘阴县| 磐安县| 当雄县| 司法| 通许县| 哈尔滨市| 崇左市| 弥渡县| 马关县| 乐至县| 广水市| 霍邱县| 太保市| 龙海市| 社旗县| 海南省| 城市| 来安县| 望奎县|