【Luogu】动态规划一

P5414 [YNOI2019] 排序 - 洛谷

思路:

可以想到对于任意一个需要换位置的数字,我们不可能换两次及以上,那么这题就可以转化为求一个最大和的最长不递减子序列,最后的答案就是众和减去这个最大和

代码:

#include <iostream>
#include <algorithm>
#include<cstring>
#include <iomanip>
#include<cctype>
#include<string>
#include <set>
#include <vector>
#include <cmath>
#include <queue>
#include <unordered_set>
#include <map>
#include <unordered_map>
#include <stack>
#include <utility>
#include <array>
#include <tuple>
using namespace std;
#define int long long
#define yes cout << "YES" << endl
#define no cout << "NO" << endlvoid solve()
{int n;cin >> n;vector<int> a(n),b(n,0);int sum = 0;for (int i = 0; i < n; i++){cin >> a[i];for (int j = 0; j < i; j++){if (a[j] <= a[i]){b[i] = max(b[i], b[j]);}}b[i] += a[i];sum += a[i];}int mx = 0;for (int i = 0; i < n; i++){mx = max(mx, b[i]);}cout << sum - mx << endl;
}
signed main()
{cin.tie(0)->sync_with_stdio(false);int t = 1;cin >> t;while (t--){solve();}return 0;
}

P2690 [USACO04NOV] Apple Catching G - 洛谷

思路:

这一题让我们求在最多w次换位中能接到的最多苹果数,一个显然的想法就是 定义dp[i]为前i个苹果中能接到的最大值,但是我们发现我们无法判断当前苹果能不能选,所以我们还要一维来判断能不能选当前苹果,这里我们就定义 dp[i][j] 为前 i 个苹果中进行了 j 次换位能获得最大值,这样我们就能判断能否选择了,显然当换位次数是奇数时,我们就能选 2,否则就是选 1

代码:

#include <iostream>
#include <algorithm>
#include<cstring>
#include <iomanip>
#include<cctype>
#include<string>
#include <set>
#include <vector>
#include <cmath>
#include <queue>
#include <unordered_set>
#include <map>
#include <unordered_map>
#include <stack>
#include <utility>
#include <array>
#include <tuple>
using namespace std;
#define int long long
#define yes cout << "YES" << endl
#define no cout << "NO" << endlvoid solve()
{int t, w;cin >> t >> w;vector<int> a(t+1);for (int i = 1; i <= t; i++){cin >> a[i];a[i]--;}vector<vector<int>> dp(t + 1, vector<int>(w + 1, 0));for (int i = 1; i <= t; i++){for (int j = 0; j <= w; j++){dp[i][j] = dp[i - 1][j];if(j)dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1]);dp[i][j] += (a[i] == j % 2);}}int mx = 0;for (int i = 0; i <= w; i++){mx = max(mx, dp[t][i]);}cout << mx;
}
signed main()
{//cin.tie(0)->sync_with_stdio(false);int t = 1;//cin >> t;while (t--){solve();}return 0;
}

P2904 [USACO08MAR] River Crossing S - 洛谷

思路:

题目告诉我们载n头牛要ΣM(1~n)的时间,让我们求载完所有牛最少要多少时间

我们定义dp[i] 为运输完前 i 头牛所花费的最短时间

那么转移方程就是 dp[i] = min(dp[i],dp[i - j] + sum[j]),其中sum[j]为运输 j 头牛耗费的时间

感觉是类完全背包问题

代码:

#include <iostream>
#include <algorithm>
#include<cstring>
#include <iomanip>
#include<cctype>
#include<string>
#include <set>
#include <vector>
#include <cmath>
#include <queue>
#include <unordered_set>
#include <map>
#include <unordered_map>
#include <stack>
#include <utility>
#include <array>
#include <tuple>
using namespace std;
#define int long long
#define yes cout << "YES" << endl
#define no cout << "NO" << endlvoid solve()
{int n, m;cin >> n >> m;vector<int> w(n+1,0),dp(n+1,1000000000);w[0] = 2 * m;for (int i = 1; i <= n; i++){cin >> w[i];w[i] += w[i - 1];}dp[0] = 0;for (int i = 1; i <= n; i++){for (int j = 1; j <= i; j++){dp[i] = min(dp[i], dp[i - j] + w[j]);}}cout << dp[n] - m;
}
signed main()
{//cin.tie(0)->sync_with_stdio(false);int t = 1;//cin >> t;while (t--){solve();}return 0;
}

P2946 [USACO09MAR] Cow Frisbee Team S - 洛谷

思路:

由于我们要保证他是F的倍数,但是我们肯定不能直接开一个 0 ~ n*F 的bool数组

那我们就需要转化了,由于我们不需要知道具体的数,我们只需要知道是否是F的倍数,所以我们可以直接开两个维度,定义dp[i][j]为前i个数组成余F为j的方法有几种

那么转移方程就是 dp[i][j] += dp[i-1][j] + dp[i-1][(j - r[i] + F) % F],这里 j - r[i] + F % F代表没选 r[i]之前的余数是多少,加F这个操作是为了防止其为负数,在大数取模中也可看见

代码:

#include <iostream>
#include <algorithm>
#include<cstring>
#include <iomanip>
#include<cctype>
#include<string>
#include <set>
#include <vector>
#include <cmath>
#include <queue>
#include <unordered_set>
#include <map>
#include <unordered_map>
#include <stack>
#include <utility>
#include <array>
#include <tuple>
using namespace std;
#define int long long
#define yes cout << "YES" << endl
#define no cout << "NO" << endl
const int MOD = 1e8;
void solve()
{int n, f;cin >> n >> f;vector<int> r(n + 1);vector<vector<int>> dp(n + 1, vector<int>(f+1, 0));for (int i = 1; i <= n; i++){cin >> r[i];r[i] %= f;dp[i][r[i]] = 1;}for (int i = 1; i <= n; i++){for (int j = 0; j <= f - 1; j++){//不选dp[i][j] += dp[i - 1][j];dp[i][j] %= MOD;//选dp[i][j] += dp[i - 1][(j - r[i] + f) % f];dp[i][j] %= MOD;}}cout << dp[n][0] % MOD;
}
signed main()
{//cin.tie(0)->sync_with_stdio(false);int t = 1;//cin >> t;while (t--){solve();}return 0;
}

P1806 跑步 - 洛谷

思路:

我们定义dp[i][j]为跑了i圈,且最后一次跑了j圈的方案数量,那么转移就是dp[ i ][ j ] += dp[ i - j ][ k ]

三重循环即可

代码:

#include <iostream>
#include <algorithm>
#include<cstring>
#include <iomanip>
#include<cctype>
#include<string>
#include <set>
#include <vector>
#include <cmath>
#include <queue>
#include <unordered_set>
#include <map>
#include <unordered_map>
#include <stack>
#include <utility>
#include <array>
#include <tuple>
using namespace std;
#define int long long
#define yes cout << "YES" << endl
#define no cout << "NO" << endlvoid solve()
{int n;cin >> n;vector<vector<int>> dp(n + 1, vector<int>(n+1,0));for (int i = 1; i <= n; i++){dp[i][i] = 1;}for (int i = 1; i <= n; i++){for (int j = 1; j < i; j++){for (int k = 1; k < j && j+k <= i; k++){dp[i][j] += dp[i-j][k];}}}int res = 0;for (int i = 1; i < n; i++){res += dp[n][i];}cout << res;
}
signed main()
{//cin.tie(0)->sync_with_stdio(false);int t = 1;//cin >> t;while (t--){solve();}return 0;
}

P1922 女仆咖啡厅桌游吧 - 洛谷

思路:

由于要确保任意的子树都满足桌游和咖啡厅数量一直,所以我们可以直接看叶子节点,只要最下面满足了,那么上面按照下面的递推即可

首先可分配的数量为其叶子节点的数量加上自身,那么最多的可选数量就是 sum / 2,然后算出来后往上递推到节点 1 即可

代码:

#include <iostream>
#include <algorithm>
#include<cstring>
#include <iomanip>
#include<cctype>
#include<string>
#include <set>
#include <vector>
#include <cmath>
#include <queue>
#include <unordered_set>
#include <map>
#include <unordered_map>
#include <stack>
#include <utility>
#include <array>
#include <tuple>
using namespace std;
#define int long long
#define yes cout << "YES" << endl
#define no cout << "NO" << endl
vector<vector<int>> g(100005);
vector<int> dp(100005,0);
void dfs(int son,int fa)
{int point = 1;for (auto s : g[son]){if (s == fa){continue;}if (g[s].size() == 1){point++;}else{dfs(s, son);dp[son] += dp[s];}}dp[son] += point / 2;
}void solve()
{int n;cin >> n;for (int i = 0; i < n-1; i++){int u, v;cin >> u >> v;g[u].push_back(v);g[v].push_back(u);}dfs(1,1);cout << dp[1];
}
signed main()
{//cin.tie(0)->sync_with_stdio(false);int t = 1;//cin >> t;while (t--){solve();}return 0;
}

P12175 [蓝桥杯 2025 省 Python B] 园艺 - 洛谷

思路:

因为我们要确定间隔,所以我们可以多开一维,定义dp[i][j]前i个树中间隔为j的最长不递减子序列

双重循环即可

代码:

#include <iostream>
#include <algorithm>
#include<cstring>
#include <iomanip>
#include<cctype>
#include<string>
#include <set>
#include <vector>
#include <cmath>
#include <queue>
#include <unordered_set>
#include <map>
#include <unordered_map>
#include <stack>
#include <utility>
#include <array>
#include <tuple>
using namespace std;
#define int long long
#define yes cout << "YES" << endl
#define no cout << "NO" << endlvoid solve()
{int n;cin >> n;vector<int> h(n+1);for (int i = 1; i <= n; i++){cin >> h[i];}vector<vector<int>> dp(n + 1, vector<int>(n + 1, 0));for (int i = 1; i <= n; i++){for (int j = 1; j <= n; j++){dp[i][j] = 1;}}int res = 0;for (int i = 2; i <= n; i++){for (int j = 1; j < i; j++){if (h[i-j] < h[i]){dp[i][j] += dp[i - j][j];res = max(res, dp[i][j]);}}}cout << res;
}
signed main()
{//cin.tie(0)->sync_with_stdio(false);int t = 1;//cin >> t;while (t--){solve();}return 0;
}

P1564 膜拜 - 洛谷

思路:

这里我们可以利用一个技巧,既然要确保二者的人数差不超过m,那我们就可以视2为-1,那么只要abs(sum) <= m 即可,同时如果 abs(sum) = len 时说明这一串都是同一个数

那么定义 dp[i] 为前 i 个分割的最小数

然后按照上面说的双重枚举即可

代码:

#include <iostream>
#include <algorithm>
#include<cstring>
#include <iomanip>
#include<cctype>
#include<string>
#include <set>
#include <vector>
#include <cmath>
#include <queue>
#include <unordered_set>
#include <map>
#include <unordered_map>
#include <stack>
#include <utility>
#include <array>
#include <tuple>
using namespace std;
#define int long long
#define yes cout << "YES" << endl
#define no cout << "NO" << endlvoid solve()
{int n, m;cin >> n >> m;vector<int> dp(n+1,1e9),sum(n+1,0);for (int i = 1; i <= n; i++){int x;cin >> x;sum[i] = sum[i - 1] + (x == 1 ? 1 : -1);}dp[0] = 0;for (int i = 1; i <= n; i++){for (int j = 1; j <= i; j++){if (abs(sum[i] - sum[j-1]) == i-j+1 || abs(sum[i] - sum[j-1]) <= m){dp[i] = min(dp[j-1] + 1, dp[i]);}}}cout << dp[n];
}
signed main()
{//cin.tie(0)->sync_with_stdio(false);int t = 1;//cin >> t;while (t--){solve();}return 0;
}

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

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

相关文章

什么是管理思维?

管理思维是指在管理活动中形成的系统性、战略性和创造性的思考方式&#xff0c;帮助个人或团队更高效地达成目标。它不仅适用于企业管理&#xff0c;也适用于个人成长、项目执行和复杂问题解决。以下是关于管理思维的核心内容&#xff1a; 一、管理思维的核心特征 1. 系统性思…

利用TCP+多进程技术实现私聊信息

服务器&#xff1a; import socket from multiprocessing import Process from threading import Threaduser_dic {}def send_recv(client_conn, client_addr):while 1:# 接收客户端发送的消息res client_conn.recv(1024).decode("utf-8")print("客户端发送…

Hbuilder 上的水印相机实现方案 (vue3 + vite + hbuilder)

效果 思路 通过 live-pusher 这个视频推流的组件来获取摄像头拿到视频的一帧图片之后&#xff0c;跳转到正常的 vue 页面&#xff0c;通过 canvas 来处理图片水印 源码 live-pusher 这个组件必须是 nvue 的 至于什么是 nvue&#xff0c;看这个官方文档吧 https://uniapp.dcl…

Spark,IDEA编写Maven项目

IDEA中编写Maven项目 1.打开IDEA新建项目2.选择java语言&#xff0c;构建系统选择Maven 3.IDEA中配置Maven 注&#xff1a;这些文件都是我们老师帮我们在网上找了改动后给我们的&#xff0c;大家可自行在网上查找 编写代码测试HDFS连接 1.在之前创建的pom.xml文件中添加下…

初识Redis · C++客户端set和zset

目录 前言&#xff1a; set sadd sismember smembers spop scard sinter sinterstore zset zadd zrange zcard zrem zrank zscore 前言&#xff1a; 前文我们已经介绍了string list hash在Redis-plus-plus的使用&#xff0c;本文我们开始介绍set和zset在redis-plus-pl…

sed命令笔记250419

sed命令笔记250419 sed&#xff08;Stream Editor&#xff09;是 Linux/Unix 系统中强大的流编辑器&#xff0c;主要用于对文本进行过滤和转换&#xff08;按行处理&#xff09;。它支持正则表达式&#xff0c;适合处理文本替换、删除、插入等操作。以下是 sed 的详细解析&…

ubuntu-24.04.2-live-server-arm64基于cloud-init实现分区自动扩容(LVM分区模式)

1. 环境 虚拟机镜像ISO&#xff1a;ubuntu-24.04.2-live-server-arm64.iso 2. 定制cloud-init镜像 2.1 安装OS 基于ubuntu-24.04.2-live-server-arm64.iso&#xff0c;通过virt-manager安装操作系统&#xff0c;语言建议选择英文&#xff0c;分区选择基于LVM的自动分区&…

vue3专题1------父组件中更改子组件的属性

理解 Vue 3 中父组件如何引用子组件的属性是一个很重要的概念。 这里涉及到 defineExpose 和 ref 这两个关键点。 方法&#xff1a;使用 defineExpose 在子组件中暴露属性&#xff0c;然后在父组件中使用 ref 获取子组件实例并访问暴露的属性。 下面我将详细解释这个过程&…

数据仓库分层架构解析:从理论到实战的完整指南​​

数据仓库分层是构建高效数据体系的核心方法论。本文系统阐述ODS、DWD、DWS、ADS四层架构的设计原理&#xff0c;结合电商用户行为分析场景&#xff0c;详解各层功能及协作流程&#xff0c;并给出分层设计的原则与避坑指南&#xff0c;帮助读者掌握分层架构的落地方法。 一、为什…

从零搭建一套前端开发环境

一、基础环境搭建 1.NVM(Node Version Manager)安装 简介 nvm&#xff08;Node Version Manager&#xff09; 是一个用于管理多个 Node.js 版本的工具&#xff0c;允许开发者在同一台机器上轻松安装、切换和使用不同版本的 Node.js。它特别适合需要同时维护多个项目&#xff…

计算机组成原理笔记(十六)——4.1基本算术运算的实现

计算机中最基本的算术运算是加法运算&#xff0c;加、减、乘、除运算最终都可以归结为加法运算。 4.1.1加法器 一、加法器的基本单元 加法器的核心单元是 全加器&#xff08;Full Adder, FA&#xff09;&#xff0c;而所有加法器都由 半加器&#xff08;Half Adder, HA&…

利用Qt创建一个模拟问答系统

界面&#xff1a; 添加了聊天显示区域&#xff08;QTextEdit&#xff09; 添加了发送按钮和清空对话按钮 优化了布局和窗口大小添加了时间戳显示 2、功能&#xff1a; 支持实时对话可以清空对话历史 支持按回车发送消息 添加了简单的关键词匹配响应系统 交互体验&#x…

神经光子渲染:物理级真实感图像生成——从麦克斯韦方程到深度学习

一、技术背景与核心突破 2025年&#xff0c;神经光子渲染&#xff08;Photonic Neural Rendering, PNR&#xff09;技术通过物理光学方程与神经辐射场的深度融合&#xff0c;在AIGC检测工具&#xff08;如GPTDetector 5.0&#xff09;的识别准确率从98%降至12%。该技术突破性地…

Linux中手动安装7-Zip软件文档

7zip位于EPEL源中&#xff0c;如果服务器可以联网或者配置了本地EPEL源则可以直接安装 yum install p7zip p7zip-plugins -y对于无法联网且没有配置本地EPEL源的服务器&#xff0c;可以通过官网下载安装包后&#xff0c;上传至服务器&#xff0c;手动安装 ## 下载地址&#x…

[密码学基础]GM/T 0018-2023 密码设备应用接口规范深度解析:技术革新与开发者实践

GM/T 0018-2023 密码设备应用接口规范深度解析&#xff1a;技术革新与开发者实践 GM/T 0018-2023《密码设备应用接口规范》是中国密码行业的重要标准&#xff0c;于2023年12月4日发布&#xff0c;2024年6月1日正式实施&#xff0c;替代了2012年版标准。该标准旨在规范密码设备…

8.QT-按钮类控件|Push Button|Radio Button|Check Box|Tool Button(C++)

Push Button 使⽤ QPushButton 表⽰⼀个按钮.这也是当前我们最熟悉的⼀个控件了. QPushButton 继承⾃ QAbstractButton .这个类是⼀个抽象类.是其他按钮的⽗类 在Qt Designer中也能够看到这⾥的继承关系 属性说明text按钮中的⽂本icon按钮中的图标iconSize按钮中图标的尺⼨sh…

CFIS-YOLO:面向边缘设备的木材缺陷检测轻量级网络解析

论文地址:https://arxiv.org/pdf/2504.11305 目录 一、论文核心贡献 二、创新点详解 2.1 CARAFE动态上采样 工作原理 优势对比 2.2 C2f_FNB轻量模块 计算效率 2.3 Inner-SIoU损失函数 三、实验验证 3.1 消融实验 3.2 对比实验 四、应用部署 4.1 边缘设备部署流程…

BUUCTF PWN刷题笔记(1-9)

才知道&#xff0c;由于栈对齐&#xff0c;直接动调看栈估计会错&#xff0c;用cyclic看 1.test_your_nc NC连接一下&#xff0c;这个网站似乎直接访问是不中的&#xff0c;怀疑是没开启web的端口。NC链接输入cat flag就OK了&#xff0c;应该只是让我这样的小菜鸟培养自信用的…

C#处理网络传输中不完整的数据流

1、背景 在读取byte数组的场景&#xff08;例如&#xff1a;读取文件、网络传输数据&#xff09;中&#xff0c;特别是网络传输的场景中&#xff0c;非常有可能接收了不完整的byte数组&#xff0c;在将byte数组转换时&#xff0c;因字符的缺失/增多&#xff0c;转为乱码。如下…

PostgreSQL 用户资源管理

PostgreSQL 用户资源管理 PostgreSQL 提供了多种机制来管理和限制用户对数据库资源的使用&#xff0c;以下是全面的资源管理方法&#xff1a; 1 连接限制 1.1 限制最大连接数 -- 在 postgresql.conf 中设置 max_connections 100 -- 全局最大连接数-- 为特定用户设置连接限…