每日OJ_牛客_合唱团(打家劫舍dp)

devtools/2024/9/19 0:48:35/ 标签: c++, 算法, 开发语言, 牛客, 数据结构, dp, 动态规划

目录

牛客_合唱团(打家劫舍dp

解析代码1

解析代码2


牛客_合唱团(打家劫舍dp

合唱团__牛客

        有 n 个学生站成一排,每个学生有一个能力值,牛牛想从这 n 个学生中按照顺序选取 k 名学生,要求相邻两个学生的位置编号的差不超过 d,使得这 k 个学生的能力值的乘积最大,你能返回最大的乘积吗?


解析代码1

        题目解析:题目要求n各学生中选择k个,使这k个学生的能力值乘积最大。这是一个最优化的问题。另外,在优化过程中,提出了相邻两个学生的位置编号差不超过d的约束。 解决的方法是采用动态规划

        代码分析:该题目是一个动态规划的问题,那么我们首先要构造出状态转移方程。 设maxVal[i][j]表示以第i个人为最后一个(前面共i个人,最后一个人必选),一共选取了j个人(包含i)时的 最大乘积。 同理,minVal[i][j]表示同样状态下的最小乘积(由于数据中存在负数,负数乘上某个极大的负数反而会变成 正的极大值,因而需要同时记录最小值)。 maxVal[i][j]很显然与maxVal[i][j-1]相关,可以理解为maxVal[i][j]由两部分组成,一部分是自身作为待选值, 另一部分是maxVal[i][j-1]加上一个人后得到的值,然后取它们的极大值,由此可以得到状态转移方程如下:

        maxVal[i][j] = max(maxVal[i][j], max(maxVal[c][j - 1] * a[i], minVal[c][j - 1] * a[i])); minVal[i][j] = min(minVal[i][j], min(maxVal[c][j - 1] * a[i], minVal[c][j - 1] * a[i])); 其中c的约束条件: i - d <= c <= i - 1 初始状态: maxVal[i][1] = a[i]; 最后遍历Maxval[i][k]即可得到最大值。

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
// 数据类型必须是long long类型,不然会溢出
long long getMax(vector<int>& v, int n, int k, int d)
{// 状态F(i,j): 以第i个人为最后一个人,总共选了j个人的最大值vector<vector<long long>> maxValue(n + 1, vector<long long>(k + 1, 0));vector<vector<long long>> minValue(n + 1, vector<long long>(k + 1, 0));// 初始化F(i, 1): 以第i个人为最后一个人,共选了1个人的最大值long long ret = 0;for (int i = 1; i <= n; ++i){maxValue[i][1] = minValue[i][1] = v[i - 1];}for (int i = 1; i <= n; ++i){// 需要选取k个人for (int j = 2; j <= k; ++j){// 约束条件:i - d <= m <= i - 1, 且不能小于1for (int m = i - 1; m >= max(i - d, 1); --m){maxValue[i][j] = max(maxValue[i][j], max(maxValue[m][j - 1] * v[i - 1],minValue[m][j - 1] * v[i - 1]));minValue[i][j] = min(minValue[i][j], min(maxValue[m][j - 1] * v[i - 1],minValue[m][j - 1] * v[i - 1]));}}// 更新最大值ret = max(ret, maxValue[i][k]);}return ret;
}int main()
{int n, k, d;cin >> n;vector<int> v(n, 0);for (int i = 0; i < n; ++i){cin >> v[i];}cin >> k;cin >> d;cout << getMax(v, n, k, d);return 0;
}

解析代码2

打家劫舍dp

#include <iostream>
#include <queue> // 里面有vector
#include <vector>
using namespace std;#define int long long
const int INF = 0x3f3f3f3f3f3f3f3f;signed main()
{int n = 0, k = 0, d = 0;cin >> n;vector<int> arr(n + 1);for(int i = 1; i <= n; ++i){cin >> arr[i]; // 还有负值}cin >> k >> d;vector<vector<int>> f(n + 1, vector<int>(k + 1, -INF));vector<vector<int>> g(n + 1, vector<int>(k + 1, INF));// f[i][j]/g[i][j]表示从1到i挑选j个人第i个人必选的最大/小乘积for(int i = 1; i <= n; ++i){f[i][1] = g[i][1] = arr[i]; // 初始化for(int j = 2; j <= min(i, k); ++j){// i - prev <= d 所以 prev >= i - dfor(int prev = max(i - d, j - 1); prev <= i - 1; ++prev) // prev代表前面挑选的最后一个位置{f[i][j] = max(f[i][j], max(f[prev][j - 1] * arr[i], g[prev][j - 1] * arr[i]));g[i][j] = min(g[i][j], min(f[prev][j - 1] * arr[i], g[prev][j - 1] * arr[i]));}}}int res = 0;for(int i = k; i <= n; ++i){res = max(res, f[i][k]);}cout << res << endl;return 0;
}

http://www.ppmy.cn/devtools/110733.html

相关文章

I.MX6U裸机-汇编LED灯实验

汇编基础语法参考&#xff1a;初识汇编语言-CSDN博客 本文主要参考正点原子《I.MX6U 嵌入式 Linux 驱动开发指南 》第八章 STM32 GPIO 回顾 我们一般拿到一款全新的芯片&#xff0c;第一个要做的事情的就是驱动其 GPIO&#xff0c;控制其 GPIO 输出高低电平&#xff0c;我们学习…

MUR2060CTR-ASEMI快恢复二极管对管MUR2060CTR

编辑&#xff1a;ll MUR2060CTR-ASEMI快恢复二极管对管MUR2060CTR 型号&#xff1a;MUR2060CTR 品牌&#xff1a;ASEMI 封装&#xff1a;TO-220AB 安装方式&#xff1a;插件 批号&#xff1a;最新 最大平均正向电流&#xff08;IF&#xff09;&#xff1a;20A 最大循环…

Unity 是否能和黑神话悟空一样,接入Nivida的DLSS,用NSight Graphics实际测试

NSight作为Nivida 显卡的调试工具&#xff0c;因为国内都是手游开发盛行的年代&#xff0c;远没有RenderDoc或者高通的QuatXXX 出名 选择NSight的原因很简单&#xff1a; Nividia 财大气粗&#xff0c;倒不是主因&#xff0c; 因为其CEO爱出名&#xff0c;所以手下的人只…

web知识

sql注入的万能密码:1’ or true#如果页面没有什么东西可见&#xff0c;首先可以用diresearch看看有没有什么隐藏的目录&#xff0c;或者检查源代码&#xff0c;如果这些都没成功可以用 dirsearch如果没有找到东西&#xff0c;可能需要调低线程 dirsearch.py -u url -e * --ti…

【LabVIEW学习篇 - 23】:简单状态机

文章目录 简单状态机状态机的创建和了解状态机实现红绿灯 简单状态机 一个优秀的应用程序离不开好的程序框架&#xff0c;不仅要很好满足用户的功能需求&#xff0c;还要考虑到系统的稳定性、实时性、可扩展性、可维护性&#xff0c;执行效率等方面。借用一些成熟的设计框架&a…

Python 数据分析与可视化

在当今的数据驱动时代&#xff0c;数据分析与可视化已成为各行各业的重要工具。Python凭借其强大的数据处理能力和丰富的可视化库&#xff0c;成为数据分析的热门语言。本指南将为您提供Python数据分析与可视化的基础知识、实用技巧和实际操作案例&#xff0c;帮助您快速上手。…

llvm后端之td定义指令信息

llvm后端之td定义指令信息 引言1 定义指令2 定义Operand3 定义SDNode4 PatFrags4.1 ImmLeaf4.2 PatLeaf 5 ComplexPattern6 谓词条件7 理解dag 引言 llvm后端通过td定义指令信息&#xff0c;并通过dag匹配将IR节点转换为平台相关的指令。 1 定义指令 td通过class Instructio…

一文说清什么是数据仓库

01 数据仓库的概念 数据仓库的概念可以追溯到20世纪80年代&#xff0c;当时IBM的研究人员开发出了“商业数据仓库”。本质上&#xff0c;数据仓库试图提供一种从操作型系统到决策支持环境的数据流架构模型。 目前对数据仓库&#xff08;Data Warehouse&#xff09;的标准定义&a…

Linux下获取磁盘卷标

最近有个需求&#xff0c;要在Linux下获取U盘等磁盘的卷标&#xff0c;刚好也发现e2fsprogs软件包里有blkid命令&#xff0c;通过该命令就可以得到相关信息&#xff0c;下面是在我机器上执行的结果&#xff1a; guochongxinxinu:~$ sudo blkid /dev/sda1: UUID"83c6ff3d-…

使用亚马逊Bedrock的Stable Diffusion XL模型实现文本到图像生成:探索AI的无限创意

引言 什么是Amazon Bedrock&#xff1f; Amazon Bedrock是亚马逊云服务&#xff08;AWS&#xff09;推出的一项旗舰服务&#xff0c;旨在推动生成式人工智能&#xff08;AI&#xff09;在各行业的广泛应用。它的核心功能是提供由顶尖AI公司&#xff08;如AI21 Labs、Anthropic…

智能听诊器:打造宠物个性化健康生活

智能听诊器不仅是一项监测工具&#xff0c;它更是宠物个性化健康管理的推动者。通过分析收集到的健康数据&#xff0c;智能听诊器帮助制定个性化的宠物健康管理计划&#xff0c;根据宠物的品种、年龄、生活习惯和健康状况&#xff0c;实施定制化的健康管理措施。 预测性维护与…

QT实现TCP/UDP通信

服务器端&#xff1a; 客户端&#xff1a; 服务器&#xff1a; widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> #include <QTcpSocket> #include <QList> #include <QMessageBox> #include <QDebug&…

前端项目使用js将dom生成图片、PDF

在进行下方操作前&#xff0c;请你先安装 html2canvas 和 jspdf 包。 1、使用html2canvas将dom元素生成图片 // 获取要转换的dom const ele document.getElementById("dom"); // 生成canvas对象 let canvas await html2canvas(ele); 2、生成PDF对象&#xff0c;将…

iPhone 16即将推出的5项苹果智能功能

在苹果的’Glowtime’ iPhone和Apple Watch发布会上&#xff0c;苹果宣布包括基础版和Pro版在内的iPhone 16从头开始都考虑了Apple Intelligence。这包括更新的Apple Silicon&#xff0c;改进的神经引擎&#xff0c;新硬件控制&#xff0c;以及最快下个月即将推出的操作系统改变…

Python精选200Tips:121-125

Spend your time on self-improvement 121 Requests - 简化的 HTTP 请求处理发送 GET 请求发送 POST 请求发送 PUT 请求发送 DELETE 请求会话管理处理超时文件上传122 Beautiful Soup - 网页解析和抓取解析 HTML 和 XML 文档查找单个标签查找多个标签使用 CSS 选择器查找标签提…

计算机毕业设计 智能推荐旅游平台 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

微服务基础知识

1 微服务基础知识 1.1 系统架构的演变 随着互联⽹的发展&#xff0c;⽹站应⽤的规模不断扩⼤&#xff0c;常规的应⽤架构已⽆法应对&#xff0c;分布式服务架构以及微服务架构势在必⾏&#xff0c;必需⼀个治理系统确保架构有条不紊的演进。 1.1.1 单体应⽤架构 Web应⽤程序…

华为网络多生成树协议

多生成树协议 一个或多个vlan可以映射到同一个生成树中&#xff1b; MSTP将一个网络划分为多个域&#xff0c;每个域有多个生成树&#xff0c;域间利用CIST 公共与内部生成树commonand internal spanning tree 保证拓扑结构无环路&#xff1b; 实例即多个vlan的集合&#xf…

qt --如何获取本地联网的网口mac地址

单独的获取某一个网卡的mac地址 在代码里 可能出现意料之外的bug 如果你本地的网卡较多 QList< QString > ABC::getMac() {QList< QNetworkInterface > nets QNetworkInterface::allInterfaces(); // 获取所有网络接口列表int nCnt nets.count();QList< QStr…

SOEX解锁Web3社交软件的无限可能

SOEX是一款创新的Web3社交交易工具&#xff0c;它结合了社交媒体与去中心化金融&#xff08;DeFi&#xff09;的特性&#xff0c;为用户提供了一个互动、分享见解并获取奖励的平台。通过SOEX&#xff0c;用户可以更方便地参与交易、交流策略&#xff0c;并享受多元化的收益方式…