牛客网编程题——合唱团(网易2017)

这篇博客分享了一个C++编程题,涉及动态规划解决最大乘积问题。题目要求在限制相邻学生编号差不超过d的情况下,从n个学生中选出k个,使他们的能力值乘积最大化。博主首先尝试了暴力枚举方法,但因数据规模小而超时。接着介绍了动态规划的解法,包括状态设计、状态转移方程以及处理负值的情况。最终通过双数组dmax和dmin存储最大值和最小值,解决了问题。文章还提及了边界条件和滚动数组优化的空间复杂度降低策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        这题在编程达人面前应该算是水题,但这算是我第一个做出来的动态规划程序,作为纪念,分享一下。题目链接:

https://www.nowcoder.com/practice/661c49118ca241909add3a11c96408c8?tpId=85&tqId=29830&tPage=1&rp=1&ru=/ta/2017test&qru=/ta/2017test/question-ranking

        简单描述一下题目:有n个学生站成一排,每个学生有一个能力值,需要按顺序选取k名学生,使得k个学生的能力值乘积最大,求该最大值。这里有两个注意点:1、相邻的两名学生在排列中的编号不能超过d(d由题目输入给出);2、学生能力值可以为负。

        一开始我大概知道是个动态规划程序,但确实不知道怎么设计,又看到数据规模很小,并且于是想用暴力法解决,然后就自然而然地超时了。先简单说一下暴力法,就是对每个合唱团的学生,有选它,或不选它两个选项。于是就可以枚举,枚举时需要记录这次访问的人index,已经选择的人数nowK,上一个选的人last(两者差<d时才能走“不选它”的选项),和当前乘积mul。程序结构比较简单,代码如下:

#include <iostream>
using namespace std;
 
int n, k, d, a[50
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值