先自己用dp解了一遍,然后看了官方讲解视频是用记忆化搜索做的。感觉那位老师的方法比较容易实现(效率上和我的差不多的);记录一下三种方法。

  • 动态规划

    地宫取宝 1.195KB C++ 正确 100 15ms 1.113MB
    #include "bits/stdc++.h"
    using namespace std;
    const int MOD = ;
    // mp是地宫地图,table[i][j]表示从坐标(1, 1)走到(i, j)的方案数
    int mp[][], table[][];
    // dp[i][j][k]表示在坐标(i, j)手中有k件物品的方案数
    int dp[][][];
    int main() {
    int n, m, k;
    scanf("%d%d%d", &n, &m, &k);
    table[][] = ;
    for (int i = ; i <= n; i++)
    for (int j = ; j <= m; j++)
    if (i != || j != )
    table[i][j] = table[i - ][j] + table[i][j - ];
    for (int i = ; i <= n; i++)
    for (int j = ; j <= m; j++)
    scanf("%d", &mp[i][j]);
    for (int i = ; i <= n; i++)
    for (int j = ; j <= m; j++) {
    dp[i][j][] = table[i][j];
    for (int x = i; x <= n; x++)
    for (int y = j; y <= m; y++) {
    // dp[x][y][z]是从dp[i][j][z - 1]推出来的;
    // 要乘(i, j)到(x, y)的方案数; 把(i, j)看做(1, 1)就相当于乘table[x - i + 1][y - j + 1]
    for (int z = ; z <= k; z++)
    if (mp[x][y] > mp[i][j])
    dp[x][y][z] = (dp[x][y][z] + dp[i][j][z - ] * 1LL * table[x - i + ][y - j + ]) % MOD ;
    }
    }
    int res = ;
    for (int i = ; i <= n; i++)
    for (int j = ; j <= m; j++)
    res = (res + dp[i][j][k] * 1LL * table[n - i + ][m - j + ]) % MOD;
    printf("%d\n", res);
    return ;
    }
  • 深度优先搜索
    地宫取宝 734B C++ 运行超时 42 运行超时 952.0KB
    #include "bits/stdc++.h"
    using namespace std;
    const int MOD = ;
    int mp[][];
    int n, m, k;
    int dfs(int x, int y, int mx, int cnt) {
    if (x > n || y > m || cnt > k) {
    return ;
    }
    if (x == n && y == m) {
    if (cnt == k || (cnt == k - && mx < mp[x][y])) {
    return ;
    }
    return ;
    }
    int res = ;
    if (mp[x][y] > mx) {
    res = (res + dfs(x + , y, mp[x][y], cnt + )) % MOD;
    res = (res + dfs(x, y + , mp[x][y], cnt + )) % MOD;
    }
    res = (res + dfs(x + , y, mx, cnt)) % MOD;
    res = (res + dfs(x, y + , mx, cnt)) % MOD;
    return res;
    }
    int main() {
    scanf("%d%d%d", &n, &m, &k);
    for (int i = ; i <= n; i++)
    for (int j = ; j <= m; j++)
    scanf("%d", &mp[i][j]);
    printf("%d\n", dfs(, , -, ));
    return ;
    }

    七组数据过了三组

  • 记忆化搜索
    地宫取宝 0.995KB C++ 正确 100 0ms 3.535MB
    #include "bits/stdc++.h"
    using namespace std;
    const int MOD = ;
    int mp[][];
    int dp[][][][];
    int n, m, k;
    int dfs(int x, int y, int mx, int cnt) {
    if (x > n || y > m || cnt > k) {
    return ;
    }
    // 因为mx可能为-1,所以这里mx + 1,后面的mx + 1也是一样
    if (dp[x][y][mx + ][cnt] != -) {
    return dp[x][y][mx + ][cnt];
    }
    if (x == n && y == m) {
    if (cnt == k || (cnt == k - && mx < mp[x][y])) {
    dp[x][y][mx + ][cnt] = ;
    return ;
    }
    dp[x][y][mx + ][cnt] = ;
    return ;
    }
    int res = ;
    if (mp[x][y] > mx) {
    res = (res + dfs(x + , y, mp[x][y], cnt + )) % MOD;
    res = (res + dfs(x, y + , mp[x][y], cnt + )) % MOD;
    }
    res = (res + dfs(x + , y, mx, cnt)) % MOD;
    res = (res + dfs(x, y + , mx, cnt)) % MOD;
    dp[x][y][mx + ][cnt] = res;
    return res;
    }
    int main() {
    scanf("%d%d%d", &n, &m, &k);
    for (int i = ; i <= n; i++)
    for (int j = ; j <= m; j++)
    scanf("%d", &mp[i][j]);
    memset(dp, -, sizeof(dp));
    printf("%d\n", dfs(, , -, ));
    return ;
    }

蓝桥杯-PREV28-地宫取宝的更多相关文章

  1. 蓝桥杯历届试题 地宫取宝 dp or 记忆化搜索

    问题描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被带到地宫的入口,国王要求他只能向右或向下行走. 走 ...

  2. 【蓝桥杯真题】地宫取宝(搜索->记忆化搜索详解)

    链接 [蓝桥杯][2014年第五届真题]地宫取宝 题目描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被 ...

  3. 地宫取宝|2014年蓝桥杯B组题解析第九题-fishers

    地宫取宝 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被带到地宫的入口,国王要求他只能向右或向下行走. 走 ...

  4. 蓝桥杯 2014本科C++ B组 地宫取宝 DFS+记忆化搜索

    历届试题 地宫取宝   时间限制:1.0s   内存限制:256.0MB 问题描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角 ...

  5. 2014 蓝桥杯 预赛 c/c++ 本科B组 第九题:地宫取宝(12') [ dp ]

      历届试题 地宫取宝   时间限制:1.0s   内存限制:256.0MB     锦囊1   锦囊2   锦囊3   问题描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件 ...

  6. 算法笔记_174:历届试题 地宫取宝(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明 ...

  7. 蓝桥杯---地宫取宝(记忆搜索=搜索+dp)

    题目网址:http://lx.lanqiao.org/problem.page?gpid=T120 问题描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值 ...

  8. Java实现 蓝桥杯 历届试题 地宫取宝

    问题描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被带到地宫的入口,国王要求他只能向右或向下行走. 走 ...

  9. 第五届蓝桥杯C++B组 地宫取宝

    代码: #include <bits/stdc++.h> using namespace std; #define ll long long const ll mod = 1e9 + 7; ...

随机推荐

  1. PAT Advanced 1043 Is It a Binary Search Tree (25) [⼆叉查找树BST]

    题目 A Binary Search Tree (BST) is recursively defined as a binary tree which has the following proper ...

  2. 光纤卡网卡的区别以及HBA的常规定义-----引自百度百科

    在讨论这个问题的时候,需要先说清楚一个问题:我们知道,在早期的SAN存储系统中,服务器与交换机的数据传输是通过光纤进行的,因为服务器是把SCSI指令传输到存储设备上,不能走普通LAN网的IP协议,所以 ...

  3. 100道Java面试题整理(助力2020面试!)

    1.您对微服务有何了解? 微服务,又称微服务 架 构,是一种架构风格,它将应用程序构建为以业务领域为模型的小型自治服务集合 . 通俗地说,你必须看到蜜蜂如何通过对齐六角形蜡细胞来构建它们的蜂窝状物.他 ...

  4. ZJNU 2349 - 抽抽抽

    为4的倍数,列出所有可能情况再判断即可 处理输入的数据对4取模 可得 4444 2244 2222 1111 3333 1133 1223 1344 1124 3324 共十种情况 所以得出答案 #i ...

  5. 常用的tensorflow函数

    在mask_rcnn常用的函数 1  tf.cast():    https://blog.csdn.net/dss875914213/article/details/86558407 2 tf.ga ...

  6. Python笔记_第一篇_面向过程_第一部分_0.开场白

    *什么是Python? Python是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido(吉多) van Rossum于1989年发明,第一个公开版本发行于1991年.在国外应用非常的广泛,国 ...

  7. share团队冲刺3

    团队冲刺第三天 昨天:完成了对输出文字,按钮控件的添加,能够将其在模拟器上运行 今天:学习输入的添加方式 问题:Android resource linking failed 在改变按钮样式的时候,出 ...

  8. JQuery获取当前屏幕的高度宽度的实现代码

    <script type="text/javascript"> $(document).ready(function() { alert($(window).heigh ...

  9. java.sql.BatchUpdateException: ORA-01691: Lob 段 CSASSSMBI.SYS_LOB0000076987C00003$$ 无法通过 128 (在表空间 HRDL_CSASS 中) 扩展

    问题: 在tomcat日志信息中出现:java.sql.BatchUpdateException: ORA-01691: Lob 段 CSASSSMBI.SYS_LOB0000076987C00003 ...

  10. POJ-1015 Jury Compromise(dp|01背包)

    题目: In Frobnia, a far-away country, the verdicts in court trials are determined by a jury consisting ...