【AcWing】蓝桥杯辅导课-数学与简单DP

目录

数学

买不到的数目

蚂蚁感冒

 饮料换购

DP

01背包问题

摘花生

最长上升子序列

地宫取宝

波动数列


数学

买不到的数目

1205. 买不到的数目 - AcWing题库

这道题的意思就是给定两个正整数p和q,求xp+yq这一个组合不能凑出来的最大正整数是多少
首先我们要知道,当p和q的最大公约数大于1时,是一定无解的。例如2和6,最大公约数是2,也就是说这两个数都是2的倍数,那么大部分2的倍数都是能够被凑出来的,所以无解。但是这道题并不需要考虑这种情况,因为题目中已经明确说明一定有解

当我们分析不出来的时候,我们可以考虑打表找规律

#include<iostream>
using namespace std;bool dfs(int m, int p, int q)
{if(!m) return true;if(m >= p && dfs(m - p, p, q)) return true;if(m >= q && dfs(m - q, p, q)) return true;return false;
}int main()
{ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);int p, q; cin >> p >> q;int res = 0;for(int i = 1;i <= 1000;i ++){if(!dfs(i, p, q)) res = i;}cout << res << '\n';return 0;
}

然后可以验证几个数,从而得到数学规律 

接下来我们看这道题中使用到的数学方法

引理:给定a,b,若d = gcd(a, b) > 1,则一定不能凑出最大数

结论:若a,b均为正整数且互质,那么ax + by,x>=0,y>=0,不能凑出的最大数是
(a - 1)(b - 1) - 1 

#include<iostream>
using namespace std;int n, m;int main()
{ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);cin >> n >> m;cout << (n - 1) * (m - 1) - 1 << '\n';return 0;
}

蚂蚁感冒

1211. 蚂蚁感冒 - AcWing题库

这道题我们会有一个疑问,就是最终所有蚂蚁都会离开杆子吗?
我们可以运用等价的思想来解决,当两只蚂蚁相遇时,正常来说是要调头,我们可以等价为是穿过,所以,最多100秒之后,所有蚂蚁都会穿过。所以,最终所有蚂蚁都会离开杆子。

我们可以分两种情况来讨论:

第一个蚂蚁向右走的情况:
1.右边向左走的,必然被感染
2.右边向右走必然不会被感染
3.左边向左走必然不会被感染
4.左边向右走:
        (1)右边存在向左走,则必然被感染
        (2)右边不存在向左走,则必然不会被感染

第一个蚂蚁向左走的情况:
1.左边向右走的,必然被感染
2.右边向右走的,必然不会被感染
3.左边向左走的,必然不会被感染
4.右边向左走:
        (1)左边存在向右走的,则必然被感染
        (2)左边不存在向右走的,则必然不会被感染 

#include <cstring>
#include <iostream>
#include <algorithm>using namespace std;const int N = 55;int n;
int x[N];int main()
{cin >> n;for (int i = 0; i < n; i ++ ) cin >> x[i];int left = 0, right = 0;    // 分别表示左边向右走的蚂蚁数量,和右边向左走的蚂蚁数量for (int i = 1; i < n; i ++ )if (abs(x[i]) < abs(x[0]) && x[i] > 0) left ++ ; // 当前遍历到的蚂蚁初始在第一只蚂蚁的左边,并且当前蚂蚁向右走else if (abs(x[i]) > abs(x[0]) && x[i] < 0) right ++ ; // 当前遍历到的蚂蚁初始在第一只蚂蚁的右边,并且当前蚂蚁向左走if (x[0] > 0 && right == 0 || x[0] < 0 && left == 0) cout << 1 << endl;else cout << left + right + 1 << endl;return 0;
}

 饮料换购

1216. 饮料换购 - AcWing题库

#include<iostream>
using namespace std;int n, sum;int main()
{ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);cin >> n;sum += n;while(n >= 3){int t = n / 3;int p = n % 3;sum += t;n = t + p;}cout << sum << '\n';return 0;
}

DP

01背包问题

2. 01背包问题 - AcWing题库

#include<iostream>
#include<algorithm>
using namespace std;const int N = 1010;int f[N], v, w, n, m;int main()
{ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);cin >> n >> m;for(int i = 1;i <= n;i ++){cin >> v >> w;for(int j = m;j >= 1;j --)if(j >= v) f[j] = max(f[j], f[j - v] + w);}cout << f[m] << endl;return 0;
}

摘花生

1015. 摘花生 - AcWing题库

#include<iostream>
#include<algorithm>
using namespace std;const int N = 110;int T, r, c, g[N][N];int main()
{ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);cin >> T;while(T --){cin >> r >> c;for(int i = 1;i <= r;i ++)for(int j = 1;j <= c;j ++) {cin >> g[i][j];g[i][j] += max(g[i - 1][j], g[i][j - 1]);}cout << g[r][c] << '\n';}return 0;
}

最长上升子序列

895. 最长上升子序列 - AcWing题库

#include<iostream>
#include<algorithm>
using namespace std;const int N = 1010;int n, a[N], f[N];int main()
{ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);cin >> n;for(int i = 1;i <= n;i ++) cin >> a[i];int res = 1;for(int i = 1;i <= n;i ++){f[i]= 1;for(int j = 1;j < i;j ++)if(a[j] < a[i]) {f[i] = max(f[i], f[j] + 1);res = max(res, f[i]);}}cout << res << '\n';return 0;
}

地宫取宝

1212. 地宫取宝 - AcWing题库

这道题可以用dfs和DP做,但是dfs会爆时间,我们先看dfs

#include<iostream>
#include<algorithm>
using namespace std;const int N = 55;
const int MOD = 1000000007;int n, m, k, ans, g[N][N];void dfs(int u, int i, int j, int t) // u表示当前拿了几件宝贝, t表示当前价值最大是多少
{// 越界了或u>k了直接返回if(i > n || j > m || u > k) return ;if(i == n && j == m) // 到达终点计算是否合法{if(u == k || u == k - 1 && g[i][j] > t) {ans ++;ans %= MOD;}return ;}// 不选dfs(u, i + 1, j, t);dfs(u, i, j + 1, t);// 选if(g[i][j] > t){dfs(u + 1, i + 1, j, g[i][j]);dfs(u + 1, i, j + 1, g[i][j]);}
}int main()
{ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);cin >> n >> m >> k;for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++) cin >> g[i][j];dfs(0, 1, 1, -1);cout << ans << '\n';return 0;
}

然后看DP的做法

状态表示需要用到4维数组,刚好与我们dfs中的函数4个参数对应
初始时,我们在左上角,此时需要对数组进行初始化
选取左上角这个位置的宝贝时,    f[1][1][1][w[1][1]] = 1
不选取左上角这个位置的宝贝时,f[1][1][0][-1] = 1
因为C++中坐标没有负数,所以我们对每个宝贝的价值都增加1,这样宝贝的价值就变成了1到13,就可以使用0来表示没有选取任何一个宝贝了

然后看状态计算。
对于当前状态f[i, j, k, c],可以由前一个状态向下走,也可以由前一个状态向右走,此时就有两个分支了。对于每一个分支,又可以分成是否拿当前这个位置[i, j]的宝贝。对于取的这一个分支,又可以分成前一个最大价值是多少。注意:不取没有什么限制,但是如果要取,则必须满足当前状态的宝物数量不为0,并且当前状态的宝贝最大值等于w[i][j]

#include <cstring>
#include <iostream>
#include <algorithm>using namespace std;const int N = 55, MOD = 1000000007;int n, m, k;
int w[N][N];
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 ++ ){int &val = f[i][j][u][v];// 不取val = (val + f[i - 1][j][u][v]) % MOD;val = (val + f[i][j - 1][u][v]) % MOD;// 取if (u > 0 && v == w[i][j]){for (int c = 0; c < v; c ++ ){val = (val + f[i - 1][j][u - 1][c]) % MOD;val = (val + f[i][j - 1][u - 1][c]) % MOD;}}}}int res = 0;for (int i = 0; i <= 13; i ++ ) res = (res + f[n][m][k][i]) % MOD;cout << res << endl;return 0;
}

波动数列

1214. 波动数列 - AcWing题库

设满足题意的一个数列的第一项为x,设di∈{a, -b},则长度为n的数列为:

由这个数列的和为s,可得:

进一步传化可得:

因为x是整数,所以分子一定是n的倍数,也就是说s 和 (n - 1)d1 + (n - 2)d2 + ... + dn - 1,两者模n的余数是相等的。所以,问题就转化成了有多少种不同的选法,使得
(n - 1)d1 + (n - 2)d2 + ... + dn - 1与s模n的结果相同。这是一个组合问题

我们来看看状态计算的两个状态是怎么推出来的。我们要根据最后一项不同来推,很明显,最后一项不同就是从第i - 1项到第 i 项选+a,还是选-b

假设前i-1项的和为C,则有(以+a为例):
 移项可得:

所以最后一项是+a的所有方案的状态是f[i - 1, (j - (n - i)a) % n]
       最后一项是+a的所有方案的状态是f[i - 1, (j + (n - i)b) % n]

最终结果就是f[n - 1, s % n]

#include <cstring>
#include <iostream>
#include <algorithm>using namespace std;const int N = 1010, MOD = 100000007;int f[N][N];int get_mod(int a, int b)   // 求a除以b的正余数
{return (a % b + b) % b;
}int main()
{ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);int n, s, a, b;cin >> n >> s >> a >> b;f[0][0] = 1;for (int i = 1; i < n; i ++ )for (int j = 0; j < n; j ++ )f[i][j] = (f[i - 1][get_mod(j - a * (n - i), n)] + f[i - 1][get_mod(j + b * (n - i), n)]) % MOD;cout << f[n - 1][get_mod(s, n)] << endl;return 0;
}

注意:取模操作需要我们自己实现,因为C++中负数取模是负数,而数列的项中是含有负数项的,所以需要自己实现求正余数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/16262.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PyQt学习记录01——加法计算器

0. 安装配置 0.1 安装相关库 首先打开你的PyCharm程序&#xff0c;然后新建一个目录用于学习&#xff0c;其次在terminal中输入 pip install pyqt5如果你不具有科学上网能力&#xff0c;请改为国内源 pip install pyqt5 -i https://pypi.douban.com/simple然后安装pyqt相关…

[Linux] 信号(singal)详解(二):信号管理的三张表、如何使用coredump文件、OS的用户态和内核态、如何理解系统调用?

标题&#xff1a;[Linux] 信号管理的三张表、如何使用coredump文件、OS的用户态和内核态、如何理解系统调用&#xff1f; 水墨不写bug &#xff08;图片来源&#xff1a;文心一言&#xff09; 正文开始&#xff1a; 目录 一、信号管理的三张表 &#xff08;1&#xff09;三张表…

2025.2.11

1> 制作一个闹钟软件 .h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QLabel> #include <QLineEdit> #include <QPushButton> #include <QTime> #include <QTimer> #include <QTimeEdit> #include <QDa…

和鲸科技上线 DeepSeek 系列模型服务,助力数智企业 AI 业务创新!

近日&#xff0c;和鲸科技团队宣布旗下数据科学协同平台 ModelWhale 实现对 DeepSeek 全系列大模型的深度支持&#xff0c;旨在帮助更多数智化转型企业提供从算力基建到业务融合的全栈式解决方案&#xff0c;快速搭建自主可控的云端智能服务体系&#xff0c;实现大模型与业务系…

使用亚马逊针对 PyTorch 和 MinIO 的 S3 连接器进行模型检查点处理

2023 年 11 月&#xff0c;Amazon 宣布推出适用于 PyTorch 的 S3 连接器。适用于 PyTorch 的 Amazon S3 连接器提供了专为 S3 对象存储构建的 PyTorch 数据集基元&#xff08;数据集和数据加载器&#xff09;的实现。它支持用于随机数据访问模式的地图样式数据集和用于流式处理…

基于 SpringBoot 和 Vue 的智能腰带健康监测数据可视化平台开发(文末联系,整套资料提供)

基于 SpringBoot 和 Vue 的智能腰带健康监测数据可视化平台开发 一、系统介绍 随着人们生活水平的提高和健康意识的增强&#xff0c;智能健康监测设备越来越受到关注。智能腰带作为一种新型的健康监测设备&#xff0c;能够实时采集用户的腰部健康数据&#xff0c;如姿势、运动…

【cocos creator】拖拽排序列表

DEMO下载 GameCtrl.ts import ItemCtrl from "./ItemCtrl";const { ccclass, property } cc._decorator;ccclass export default class GameCtrl extends cc.Component {property(cc.Node)content: cc.Node null;property(cc.Node)prefab: cc.Node null;arr []…

Vision Transformer:打破CNN垄断,全局注意力机制重塑计算机视觉范式

目录 引言 一、ViT模型的起源和历史 二、什么是ViT&#xff1f; 图像处理流程 图像切分 展平与线性映射 位置编码 Transformer编码器 分类头&#xff08;Classification Head&#xff09; 自注意力机制 注意力图 三、Coovally AI模型训练与应用平台 四、ViT与图像…

国产编辑器EverEdit - 编辑辅助功能介绍

1 编辑辅助功能 1.1 各编辑辅助选项说明 1.1.1 行号 打开该选项时&#xff0c;在编辑器主窗口左侧显示行号&#xff0c;如下图所示&#xff1a; 1.1.2 文档地图 打开该选项时&#xff0c;在编辑器主窗口右侧靠近垂直滚动条的地方显示代码的缩略图&#xff0c;如下图所示&…

Spring AI 介绍

文章来源&#xff1a;AI 概念 (AI Concepts) _ Spring AI1.0.0-SNAPSHOT中文文档(官方文档中文翻译)|Spring 教程 —— CADN开发者文档中心 本节介绍 Spring AI 使用的核心概念。我们建议仔细阅读它&#xff0c;以了解 Spring AI 是如何实现的。 模型 AI 模型是旨在处理和生成…

Spring MVC 拦截器(Interceptor)与过滤器(Filter)的区别?

1、两者概述 拦截器&#xff08;Interceptor&#xff09;&#xff1a; 只会拦截那些被 Controller 或 RestController 标注的类中的方法处理的请求&#xff0c;也就是那些由 Spring MVC 调度的请求。过滤器&#xff08;Filter&#xff09;&#xff1a; 会拦截所有类型的 HTTP …

qt QCommandLineOption 详解

1、概述 QCommandLineOption类是Qt框架中用于解析命令行参数的类。它提供了一种方便的方式来定义和解析命令行选项&#xff0c;并且可以与QCommandLineParser类一起使用&#xff0c;以便在应用程序中轻松处理命令行参数。通过QCommandLineOption类&#xff0c;开发者可以更便捷…

Flink KafkaConsumer offset是如何提交的

一、fllink 内部配置 client.id.prefix&#xff0c;指定用于 Kafka Consumer 的客户端 ID 前缀partition.discovery.interval.ms&#xff0c;定义 Kafka Source 检查新分区的时间间隔。 请参阅下面的动态分区检查一节register.consumer.metrics 指定是否在 Flink 中注册 Kafka…

从Word里面用VBA调用NVIDIA的免费DeepSeekR1

看上去能用而已。 选中的文字作为输入&#xff0c;运行对应的宏即可&#xff1b;会先MSGBOX提示一下&#xff0c;然后相关内容追加到word文档中。 需要自己注册生成好用的apikey Option ExplicitSub DeepSeek()Dim selectedText As StringDim apiKey As StringDim response A…

网络工程师 (29)CSMA/CD协议

前言 CSMA/CD协议&#xff0c;即载波监听多路访问/碰撞检测&#xff08;Carrier Sense Multiple Access with Collision Detection&#xff09;协议&#xff0c;是一种在计算机网络中&#xff0c;特别是在以太网环境下&#xff0c;用于管理多个设备共享同一物理传输介质的重要…

WPS中如何批量上下居中对齐word表格中的所有文字

大家好&#xff0c;我是小鱼。 在日常制作Word表格时&#xff0c;经常需要对表格中的内容进行排版。经常会把文字设置成左对齐、居中对齐或者是右对齐&#xff0c;这些对齐方式都比较好设置&#xff0c;有时制作的表格需要把文字批量上下居中对齐&#xff0c;轻松几步就可以搞…

GeekPad智慧屏编程控制

前面通过homeassistant和emqx一番折腾&#xff0c;已经可以控制GeekPad智慧屏的开关了。但是这中间用到的软件对环境依赖非常高&#xff0c;想再优化一下&#xff0c;把这两个工具都装到手机上&#xff0c;最后勉强实现了&#xff0c;但是还得借用模拟器和容器&#xff0c;稳定…

【DeepSeek】在本地计算机上部署DeepSeek-R1大模型实战(完整版)

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈人工智能与大模型应用 ⌋ ⌋ ⌋ 人工智能&#xff08;AI&#xff09;通过算法模拟人类智能&#xff0c;利用机器学习、深度学习等技术驱动医疗、金融等领域的智能化。大模型是千亿参数的深度神经网络&#xff08;如ChatGPT&…

可编程网卡芯片在京东云网络的应用实践【BGW边界网关篇】

目录导览 文章背景 一.网关问题分析 BGW专线网关机器运维变更困难 BGW专线网关故障收敛链路复杂且长 BGW专线网关不具备异构架构下的灾备能力 BGW专线网关硬件资源成本居高不下 二.技术方案设计实现 网络拓扑规划与VIP架构升级 硬件实现与N-Tb流量平滑迁移 三.落地…

接口测试Day12-持续集成、git简介和安装、Gitee远程仓库、jenkins集成

持续集成 概念&#xff1a; 团队成员将自己的工作成果&#xff0c;持续集成到一个公共平台的过程。成员可以每天集成一次&#xff0c;也可以一天集成多 次。 相关工具&#xff1a; 本地代码管理&#xff1a;git远程代码管理&#xff1a;gitee(国内)、github(国外)、gitlib(公司…