先自己用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. 吴裕雄--天生自然MySQL学习笔记:MySQL PHP 语法

    MySQL 可应用于多种语言,包括 PERL, C, C++, JAVA 和 PHP. 在这些语言中,Mysql在PHP的web开发中是应用最广泛. PHP提供了多种方式来访问和操作Mysql数据库记 ...

  2. one_day_one_linuxCmd---tar命令

    <坚持每天学习一个 linux 命令,今天我们来学习 tar 命令> 摘要:tar 命令是一个 Linux 下的打包程序,通常在 Linux 下,打包和压缩是不同的程序,打包通过 tar ...

  3. RTMP、RTSP

    一.参考网址 1.RTMP.RTSP.HTTP视频协议详解(附:直播流地址.播放软件) 2.海康RTSP流转RTMP并推送至WEB端展示 3.使用FFmpeg将rtsp流摄像头视频转码为rtmp播放 ...

  4. 苹果浏览器移动端click事件延迟300ms的原因以及解决办法

    这要追溯至 2007 年初.苹果公司在发布首款 iPhone 前夕,遇到一个问题 —— 当时的网站都是为大屏幕设备所设计的.于是苹果的工程师们做了一些约定,应对 iPhone 这种小屏幕浏览桌面端站点 ...

  5. 熟练使用WebApi开发

    在建立WebApi框架的时候,要想自己的业务需求是什么.例如PC端(前端),APP端都要使用的同一接口,就得考虑Webapi来提供接口支持了.最近公司刚好让我整合一下公司的接口项目(有WebServi ...

  6. Linux进程的诞生和消亡

    1.进程的诞生 (1).进程0和进程1 (内核里边的固有的) (2).fork函数和vfork函数用于新进程的产生 2.进程的消亡 (1).正常终止和异常终止 (2).进程在运行时需要消耗系统资源(内 ...

  7. [ZJOI2006]书架(二分+树状数组)

    这题90%以上的人做法为裸的平衡树,实际上根本没必要还常数大,最好的方法是二分+树状数组.具体做法是,开3倍内存,初始把中间n位赋值为1.对于每个操作:1&2.删除该位,将其丢在头/尾(开三倍 ...

  8. 5314跳跃游戏IV

    题目:给你一个整数数组 arr ,你一开始在数组的第一个元素处(下标为 0).每一步,你可以从下标 i 跳到下标:    i + 1 满足:i + 1 < arr.length    i - 1 ...

  9. 数学之美_正态分布(Python代码)

    1 在概率统计中,我们针对某个事件当中各个样本发生的概率的频率进行统计,用一个函数的形式写出的这个概率的频率函数就叫做分布函数. 2 分布函数顾名思义,就是某个连续事件发生频率的汇总表示.再直白一点儿 ...

  10. 几个Java基础题

    1.java中线程能不能重复start t1.start();        System.out.println("ssss");        t1.start(); 答:第一 ...