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

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

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

2019-11-10 20:13:50
字體:
供稿:網(wǎng)友
  問題描述  X 國王有一個地宮寶庫。是 n x m 個格子的矩陣。每個格子放一件寶貝。每個寶貝貼著價值標簽。  地宮的入口在左上角,出口在右下角。  小明被帶到地宮的入口,國王要求他只能向右或向下行走。  走過某個格子時,如果那個格子中的寶貝價值比小明手中任意寶貝價值都大,小明就可以拿起它(當然,也可以不拿)。  當小明走到出口時,如果他手中的寶貝恰好是k件,則這些寶貝就可以送給小明。  請你幫小明算一算,在給定的局面下,他有多少種不同的行動方案能獲得這k件寶貝。輸入格式  輸入一行3個整數(shù),用空格分開:n m k (1<=n,m<=50, 1<=k<=12)  接下來有 n 行數(shù)據(jù),每行有 m 個整數(shù) Ci (0<=Ci<=12)代表這個格子上的寶物的價值輸出格式  要求輸出一個整數(shù),表示正好取k個寶貝的行動方案數(shù)。該數(shù)字可能很大,輸出它對 1000000007 取模的結(jié)果。樣例輸入2 2 21 22 1樣例輸出2樣例輸入2 3 21 2 32 1 5樣例輸出14題目分析:數(shù)據(jù)量不大,考慮用四維dp,dp[i][j][ma][num]表示到點(i,j)時最大值為ma取得了num個寶貝的方法數(shù),對于某個點如果它的寶藏值大于當前最大值,則我們可以取也可以不取,否則我們只能不取,因此轉(zhuǎn)移方程: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]第一點不取這題還有兩個坑點,第一:上述轉(zhuǎn)移方程要分成兩段寫,因為是對1e9+7取模,我們考慮最壞的情況,括號里的數(shù)就可能超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);}
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 密山市| 尤溪县| 梧州市| 虞城县| 五常市| 西乌珠穆沁旗| 青冈县| 子洲县| 岳阳市| 花莲县| 壤塘县| 鄯善县| 林西县| 衡东县| 施秉县| 兴国县| 五指山市| 教育| 长治县| 锡林郭勒盟| 涡阳县| 汾阳市| 西乌| 石狮市| 道孚县| 武邑县| 怀仁县| 浦北县| 陵川县| 桐柏县| 合阳县| 石家庄市| 陆河县| 库尔勒市| 台南县| 资阳市| 永川市| 商都县| 竹山县| 娄烦县| 乌审旗|