题目描述

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

输入描述:

每个输入包含 1 个测试用例。每个测试数据的第一行包含一个整数 n (1 <= n <= 50),表示学生的个数,接下来的一行,包含 n 个整数,按顺序表示每个学生的能力值 ai(-50 <= ai <= 50)。接下来的一行包含两个整数,k 和 d (1 <= k <= 10, 1 <= d <= 50)。

输出描述:

输出一行表示最大的乘积。

输入

复制

3
7 4 7
2 50

输出

复制

49

算法:

采用动态规划进行解题,遇到满足如下条件的问题时可采用动态规划:

  1. 主问题的答案 包含了 可分解的子问题答案 (也就是说,问题可以被递归的思想求解)
  2. 递归求解时, 很多子问题的答案会被多次重复利用

动态规划问题可以采用递归方法完成,但是递归在a题的过程中很容易超时或超内存,所以往往使用二维数组来解决问题

动态规划的实质——通过对子问题的求解,最终完成对原本问题的求解,确定递推公式,通过子问题推导或递归的求出原问题的解。

解题思路:

  • 按顺序在n名学生中选取k名,使其能力值乘积最大,需要对这个题目进行拆分
  • 从考虑1名学生的能力值最大开始,逐渐到2名,3名,k名,其推导过程即为所需递推公式
  • 使用a[]数组作为输入的学生能力值,maxv[kk][i]数组作为最大能力值矩阵,kk表示选取kk名学生,i表示最后一名学生是第i个学生,通过已确定的k-1个学生的maxv[k-1][i-1]再乘上第i个学生的能力值a[i],即可得到maxv[kk][i].
  • 同时能力值可能有正有负,最大能力值也可能是一个最小负值乘以另一个负值所得,所以需要minv[kk][i]作为最小能力值矩阵
  • 可得maxv[kk][i]=max(maxv[k-1][i-1]*a[i], minv[k-1][i-1]*a[i])
  • maxv[1][i]即每个学生的能力值a[i]
  • 要求相邻两个学生的位置编号的差不超过 d,即从最后一个学生向前寻找下一个学生时,两个学生之间的编号差<d

代码:

#include<iostream>
#include<algorithm>
using namespace std;int main()
{int a[55];int n,k,d,kk;long long maxv[12][55],minv[12][55],res=0;for(int i=0;i<12;i++){for(int j=0;j<55;j++){maxv[i][j]=0;minv[i][j]=0;}}cin>>n;for(int i=1;i<=n;i++)cin>>a[i];cin>>k>>d;for(int i=1;i<=n;i++)maxv[1][i]=minv[1][i]=a[i];for(int i=1;i<=n;i++)//第i个学生为最后一个学生{for(kk=2;kk<=k;kk++)//一共选取kk名学生{for(int j=i-1;j>0&&i-j<=d;j--){//从最后一名学生的左侧第一个开始选,且两个学生之前的编号差小于dmaxv[kk][i]=max(maxv[kk][i],max(maxv[kk-1][j]*a[i],minv[kk-1][j]*a[i]));minv[kk][i]=min(minv[kk][i],min(minv[kk-1][j]*a[i],maxv[kk-1][j]*a[i]));}}res=max(res,maxv[k][i]);}cout<<res<<endl;return 0;
}

网易2017校招合唱团相关推荐

  1. 【在线笔试题解题报告系列】网易2017校招内推笔试之编程题【持续更新】

    网易今年把内推笔试放在牛客网上办,然后出了一批编程题. 题目在: http://www.nowcoder.com/test/2252286/summary http://www.nowcoder.co ...

  2. 网易2017校招编程:计算糖果

    A,B,C三个人是好朋友,每个人手里都有一些糖果,我们不知道他们每个人手上具体有多少个糖果,但是我们知道以下的信息: A - B, B - C, A + B, B + C. 这四个数值.每个字母代表每 ...

  3. 网易2017校招编程:优雅的点

    小易有一个圆心在坐标原点的圆,小易知道圆的半径的平方.小易认为在圆上的点而且横纵坐标都是整数的点是优雅的,小易现在想寻找一个算法计算出优雅的点的个数,请你来帮帮他. 例如:半径的平方如果为25 优雅的 ...

  4. 2017校招信息每日汇总(更新至8.4)

    2017校招信息每日汇总(更新至8.4) 2016-07-25 18:24:05 校招攻略 [想获取内推方式请在APP客户端评论区留邮箱,我们会邮件联系你] U料内推群: 2017秋季校招内推2群 Q ...

  5. 网易2017春招笔试真题编程题集合

    网易2017春招笔试真题编程题集合 题目来源:牛客网 https://www.nowcoder.com/profile/7952866/test/7811777/83061 1.双核处理 题目描述 一 ...

  6. 【牛客】网易2018校招数据分析师笔试解析

    [牛客]网易2018校招数据分析师笔试解析 * 选择题根据牛客网下方讨论整理,三道大题均为自己答案,欢迎大家讨论并给予指正. (https://www.nowcoder.com/test/107788 ...

  7. 数据分析真题日刷 | 网易2018校招数据分析师笔试卷

    今日真题 网易2018校招数据分析师笔试卷(来源:牛客网) 题型 客观题:单选20道 主观题:问答1道,编程2道 完成时间 120分钟 牛客网评估难度系数 3颗星 ❤️ 「更多数据分析真题」 < ...

  8. 今日头条2017校招(出题数目)

    题目描述 头条的2017校招开始了!为了这次校招,我们组织了一个规模宏大的出题团队.每个出题人都出了一些有趣的题目,而我们现在想把这些题目组合成若干场考试出来.在选题之前,我们对题目进行了盲审,并定出 ...

  9. 【网易2017春招】赶去公司 解题报告

    [网易2017春招]赶去公司 解题报告 标签(空格分隔): 牛客网 题目地址:https://www.nowcoder.com/questionTerminal/5c7657015d3d49369c4 ...

  10. 魔法币 java_网易2018校招笔试编程题-魔法币 java实现

    魔法币 原题 小易准备去魔法王国采购魔法神器,购买魔法神器需要使用魔法币,但是小易现在一枚魔法币都没有,但是小易有两台魔法机器可以通过投入x(x可以为0)个魔法币产生更多的魔法币. 魔法机器1:如果投 ...

最新文章

  1. usaco Runaround Numbers
  2. MCP3202的使用
  3. 在linux中的virtualbox无法挂载usb设备的解决方法
  4. Spring4中的@Value的使用(学习笔记)
  5. linux设置静态ip后端口不能上网,Centos7设置静态IP后无法上网的解决方法
  6. 信息学奥赛一本通(1106:年龄与疾病)
  7. java编码转换报错_Java中BeanUtils的日期转换 代码报错 怎么解决
  8. css-modules,可视化介绍CSS Modules是什么?
  9. python 指针_C++的动态内存:C++的指针
  10. adb连接MuMu、逍遥、夜神、雷电模拟器以及腾讯手游助手以及断开连接
  11. Nginx系列(4):Web服务器分析(理论上)
  12. mcafee杀死oracle,【搬运】跟客服要来的迈克菲卸载工具,拯救你的笔记本
  13. django相关报错知识整理
  14. Java版飞翔的小鸟代码完整
  15. 毕竟,连少宇都无法击败的人,是没有资格做自己的对手的
  16. 一起来自制水果甜品吧
  17. springboot 使用mybatis-plus 配置乐观锁。
  18. Mac快速创建文件、文件夹
  19. JDBC使用报错: java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not all
  20. 循环-菲波那切数列II

热门文章

  1. 人工智能——自然演绎推理
  2. 转载:“凤求凰”的解释,有才
  3. 亚马逊awsome day_亚马逊Prime Day交易上线时如何获得警报
  4. android api17_现在在Android 17中
  5. TAP流量复制器在网络流量采集中的应用
  6. 打开360浏览器显示无法连接服务器错误,最近360浏览器老是无法打开网页,提示错误如图,但是只要刷新就可以打开了,这是怎么回事?...
  7. Keil C语言 宏重复定义 问题分析与处理
  8. 适用于 Linux 系统的 11 款图像查看器
  9. 六度空间(广度优先遍历 · 数据结构 · 图)
  10. 李克秋 加盟天津大学 计算机学院,17 天津大学