蓝桥杯-地宫取宝
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 2
2 1
输出样例1:
2
输入样例2:
2 3 2
1 2 3
2 1 5
输出样例2:
14
题解:
dp分析:
常见问题: 为什么取第(i,j)物品的时候要满足 c == w[i][j] ? 以及为什么状态转移方程2 为什么是0...c累加
- 我们原本定义了f[i][j][k][c]表示的是 在第(i, j)上的, 取了k个物品且这k个物品的最大值不超过c, 这里我们假设把f[i][j][k][c]表示成 在第(i, j)上的, 取了k个物品且这k个物品的最大值等于c, 这时候需要满足(w[i][j] == c)应该能理解吧。
- 那我们要想让我们假设的变成原本表示的含义, 需要让 f[i][j][k][c] 累加上 f[i][j][k][t] t要满足小于c, 这样我们f[i][j][k][c]表示的集合就从假设的变成了原本的, 但是如果f[i][j][k][c]不满足假设的含义, 那么我们没法让f[i][j][k][c]表示成原本的含义
- 所以取(i,j)上的物品是要满足(w[i][j]==c) 是为了能够更好的计算出正确含义的f[i][j][k][c]的值
Orz笔者是这么理解的~
详细的状态转移如下图:
注意事项:
我们f数组的第四维是代表 最大值不超过c, 但是题中 c = [0,12], 由于当我们没有选择任何一个物品的时候应该表示成-1, 但是下标没法是负的, 所以我们可以把每个 c 都加1, 也就是w[i][j] + 1. 这样我们 f 的第四维在没有取任何物品时就可以用 下标 0 表示了
看不懂的话, 可以先看这两个题, 摘花生 和 最长上升子序列, 本题是前两道题的揉和
ac代码👇
#include <bits/stdc++.h>
using namespace std;
const int N = 55, MOD = 1000000007;int w[N][N], n, m, k;
int f[N][N][13][14]; int main()
{cin >> n >> m >> k;for (int i = 1; i <= n; i ++)for (int j = 1; j <= m; j ++) cin >> w[i][j], w[i][j] ++;// 初始化f[1][1][1][w[1][1]] = 1; // 取f[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 u = 0; u <= k; u ++)for (int v = 0; v <= 13; v ++){f[i][j][u][v] = (f[i][j][u][v] + f[i][j - 1][u][v]) % MOD; // 状态计算 1f[i][j][u][v] = (f[i][j][u][v] + f[i - 1][j][u][v]) % MOD; // 状态计算 2if (u > 0 && w[i][j] == v) // u > 0 加不加都行, 不影响答案, 因为 u == 0的时候表示什么都没选, 进入下面的循环也没意义{for (int c = 0; c < v; c ++) // 常见问题解释的就是这里, 需要加上比 v 小的f, 才能让 f[i][j][k][c]表示的含义正确{f[i][j][u][v] = (f[i][j][u][v] + f[i][j - 1][u - 1][c]) % MOD; // 状态计算 3f[i][j][u][v] = (f[i][j][u][v] + f[i - 1][j][u - 1][c]) % MOD; // 状态计算 4}}}}int res = 0;for (int i = 0; i <= 13; i ++) res = (res + f[n][m][k][i]) % MOD;cout << res << endl;return 0;
}
觉得写的不错的话, 点个赞吧~
相关文章:

蓝桥杯-地宫取宝
X 国王有一个地宫宝库,是 nm 个格子的矩阵,每个格子放一件宝贝,每个宝贝贴着价值标签。 地宫的入口在左上角,出口在右下角。 小明被带到地宫的入口,国王要求他只能向右或向下行走。 走过某个格子时,如果那个…...

带头单链表 C++实现
节点定义 带头单链表:我们只需要一个结点指针指向整个链表的第一个节点,这样我们就可以通过next指针访问整个链表内的所有节点 template<class T> struct ListNode {T _val;ListNode* _next;ListNode(const T &val):_val(val),_next(nullptr){…...
学习c#第24天 枚举类型
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace enumType { //定义枚举 public enum Week { 星期一, 星期二, 星期三, 星期四, 星期…...
TensorFlow运行bug汇总
1、ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1 解决方案 pip install urllib31.26.15 -i https://pypi.tuna.tsinghua.edu.cn/simple 升级或者降级 (TF2.1) C:\Users\Administrator>pip install urllib31.26.15 -i https://pypi.tuna.tsinghua.edu.cn/sim…...
docker部署调度程序
Dockerfile(构建初始镜像) # python:3.8-slim-buster为精简版的python FROM python:3.8-slim-buster # 1059为组的id,newgroup为组名,1088为用户的id,newuser为新用户 RUN groupadd -g 1059 newgroup && \useradd -g -u 1088 -g newgroup -m newuser USER newuser RUN…...
websocket和http协议的区别
ws(websocket)协议和http协议是两种不同的协议。 http:http是一种用于传输超文本的应用层协议,通常用于web端浏览器和web端服务器之间传输数据。http也是基于tcp的,但是HTTP只能在同一时刻单向发送消息,是一种半双工通信。&#…...

CSS之定位
目录 CSS定位为什么需要定位定位组成定位的叠放顺序拓展 CSS定位 为什么需要定位 浮动可以让多个块级盒子一行没有缝隙排列显示,经常用于横向排列盒子定位则是可以让盒子自由的在某个盒子内移动位置或者固定屏幕中的某个位置,并且可以压住其他盒子 定…...
[IM002][Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序
解决办法: 安装驱动 下载 ODBC Driver for SQL Server - ODBC Driver for SQL Server | Microsoft Learn...

神经网络复习--神经网络算法模型及BP算法
文章目录 神经网络模型的构成BP神经网络 神经网络模型的构成 三种表示方式: 神经网络的三要素: 具有突触或连接,用权重表示神经元的连接强度具有时空整合功能的输入信号累加器激励函数用于限制神经网络的输出 感知神经网络 BP神经网络 …...

【Java】/*方法的使用-快速总结*/
目录 一、什么是方法 二、方法的定义 三、实参和形参的关系 四、方法重载 五、方法签名 一、什么是方法 Java中的方法可以理解为C语言中的函数,只是换了个名称而已。 二、方法的定义 1. 语法格式: public static 返回类型 方法名 (形参列表) { //方…...
kotlin中协程相关
协程 用同步的方式写出异步的效果协程最重要的是通过非阻塞挂起和恢复实现了异步代码的同步编写方式挂起函数(suspend)不一定就是在子线程中执行的,但是通常在定义挂起函数时都会为它指定其他线程,这样挂起才有意义解决多层嵌套回调 协程不是线程&…...

(自适应手机端)物流运输快递仓储网站模板 - 带三级栏目
(自适应手机端)物流运输快递仓储网站模板 - 带三级栏目PbootCMS内核开发的网站模板,该模板适用于物流运输网站、仓储货运网站等企业,当然其他行业也可以做,只需要把文字图片换成其他行业的即可;自适应手机端,同一个后台…...

Navicat导出表结构到Excel或Word
文章目录 sql语句复制到excel复制到Word sql语句 SELECTcols.COLUMN_NAME AS 字段,cols.COLUMN_TYPE AS 数据类型,IF(pks.CONSTRAINT_TYPE PRIMARY KEY, YES, NO) AS 是否为主键,IF(idxs.INDEX_NAME IS NOT NULL, YES, NO) AS 是否为索引,cols.IS_NULLABLE AS 是否为空,cols.…...

Golang编译优化——稀疏条件常量传播
文章目录 一、概述二、稀疏条件常量传播2.1 初始化worklist2.2 构建def-use链2.3 更新值的lattice2.4 传播constant值2.5 替换no-constant值 一、概述 常量传播(constant propagation)是一种转换,对于给定的关于某个变量 x x x和一个常量 c …...
人工智能培训讲师咨询叶梓介绍及智能医疗技术与ChatGPT临床应用三日深度培训提纲
1、授课老师简介 叶梓,上海交通大学计算机专业博士毕业,高级工程师。主研方向:数据挖掘、机器学习、人工智能。历任国内知名上市IT企业的AI技术总监、资深技术专家,市级行业大数据平台技术负责人。 长期负责城市信息化智能平台的…...

HCIP(BGP综合实验)--8
一:实验要求 二:实现过程 (一)配置IP地址: AR1: [AR1]int g0/0/0 [AR1-GigabitEthernet0/0/0]ip add 12.1.1.1 24 [AR1-GigabitEthernet0/0/0]int l0 [AR1-LoopBack0]ip add 172.16.0.1 32 [AR1-LoopBack0]int l1 […...

深入理解C++中的Vector容器:用容器构建高效程序
文章目录 vector介绍vector常用的成员函数有关vector定义的函数vector的迭代器使用vector关于空间操作的成员函数vector的增删查改 总结 vector介绍 在C语言的库中包含有公共数据结构的实现,C的这个部分内容就是众所周知的STL(标准模版库)&a…...
目标检测YOLO实战应用案例100讲-基于深度学习的交通场景多尺度目标检测算法研究与应用(下)
目录 3.2 基于空洞卷积的特征融合模块设计 3.3 改进k-means聚类算法的anchor尺寸优化设计...
react 类组件 和 函数组件 声明周期 对比
React 的类组件和函数组件在生命周期方面存在一些差异。以下是它们之间的对比: 类组件的生命周期 React 类组件的生命周期可以分为三个阶段:挂载、更新和卸载。 1、挂载阶段: constructor():组件实例化时调用,用于…...

智慧变电站守护者:TSINGSEE青犀AI视频智能管理系统引领行业革新
一、方案概述 随着科技的不断进步,人工智能(AI)技术已经深入到各个领域。在变电站安全监控领域,引入AI视频监控智能分析系统,可以实现对站内环境、设备状态的实时监控与智能分析,从而提高变电站的安全运行…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...

手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...

Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...