题目:

有 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

思路:
采用动态规划。设Maxval[i][j]表示以第i个人为最后一个人,一共选取了j+1个人时的最大乘积。

同理,Minval[i][j]表示同样状态下的最小乘积(由于数据中存在负数,负数乘上某个极大的负数反而会变成正的极大值,因而需要同时记录最小值)。Maxval[i][j]很显然与Maxval[i][j-1]相关,可以理解为Maxval[i][j]由两部分组成,一部分是自身作为待选值,另一部分是Maxval[i][j-1]乘上一个人后得到的值,然后取它们的极大值,由此可以得到状态转移方程如下:

最后遍历Maxval[i][k]即可得到最大值。

代码AC:
public class Choir {public static void main(String[] args){Scanner s = new Scanner(System.in);while(s.hasNextInt()){int n = s.nextInt(); //学生人数int[] ability = new int[n];for(int i = 0; i < n; i++){ability[i] = s.nextInt();}int k = s.nextInt();int d = s.nextInt();//maxProduct[i][j]表示以第i个人为结尾,合唱团的人数为j+1时,合唱团最大的能力乘积long[][] maxProduct = new long[n][k]; //minProduct[i][j]表示以第i个人为结尾,合唱团的人数为j+1时,合唱团最小的能力乘积long[][] minProduct = new long[n][k];//合唱团中只有一个人for(int i = 0; i < n; i++){maxProduct[i][0] = ability[i];minProduct[i][0] = ability[i];}long max = Long.MIN_VALUE;for(int i = 0; i < n; i++){for(int j = 1; j < k; j++){for(int p = i-1; p >= Math.max(i-d,0); p--){maxProduct[i][j] = Math.max(maxProduct[i][j],maxProduct[p][j-1]*ability[i]);maxProduct[i][j] = Math.max(maxProduct[i][j],minProduct[p][j-1]*ability[i]);minProduct[i][j] = Math.min(minProduct[i][j],minProduct[p][j-1]*ability[i]);minProduct[i][j] = Math.min(minProduct[i][j],maxProduct[p][j-1]*ability[i]);}}max = Math.max(max, maxProduct[i][k-1]);}System.out.println(max);}}}// end of class
												

合唱团(2016网易编程题)相关推荐

  1. 2018校招笔试题——网易编程题跳石板

    题目与要求如下所示: [编程题] 跳石板 时间限制:1秒 空间限制:32768K 小易来到了一条石板路前,每块石板上从1挨着编号为:1.2.3....... 这条石板路要根据特殊的规则才能前进:对于小 ...

  2. 《网易编程题》计算糖果

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

  3. 《网易编程题》藏宝图

    题目描述 牛牛拿到了一个藏宝图,顺着藏宝图的指示,牛牛发现了一个藏宝盒,藏宝盒上有一个机关,机关每次会显示两个字符串 s 和 t,根据古老的传说,牛牛需要每次都回答 t 是否是 s 的子序列.注意,子 ...

  4. 《网易编程题》下厨房

    题目:牛牛想尝试一些新的料理,每个料理需要一些不同的材料,问完成所有的料理需要准备多少种不同的材料. 输入描述: 每个输入包含 1 个测试用例.每个测试用例的第 i 行,表示完成第 i 件料理需要哪些 ...

  5. 京东2016校招编程题

    记得有一个大题,说的是给定一个n*n的矩阵,要求从1开始填充矩阵,最后的矩阵是蛇形的.即如下: n=3,      7 8    1 6  9    2 5  4   3 n=4,    10 11 ...

  6. 【网易编程题】小易魔法王国采购魔法神器

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

  7. 2016百度编程题:钓鱼比赛

    题目描述 ss请cc来家里钓鱼,鱼塘可划分为n*m的格子,每个格子每分钟有不同的概率钓上鱼,cc一直在坐标(x,y)的格子钓鱼,而ss每分钟随机钓一个格子.问t分钟后他们谁至少钓到一条鱼的概率大?为多 ...

  8. 《网易编程题》疯狂队列

    小易老师是非常严厉的,它会要求所有学生在进入教室前都排成一列,并且他要求学生按照身高不递减的顺序排列.有一次,n个学生在列队的时候,小易老师正好去卫生间了.学生们终于有机会反击了,于是学生们决定来一次 ...

  9. 《网易编程题》买苹果

    题目描述 小易去附近的商店买苹果,奸诈的商贩使用了捆绑交易,只提供6个每袋和8个每袋的包装(包装不可拆分). 可是小易现在只想购买恰好n个苹果,小易想购买尽量少的袋数方便携带.如果不能购买恰好n个苹果 ...

最新文章

  1. vue.js created函数注意事项
  2. R语言与数据分析(8)-获取帮助
  3. java --String类解决面试问题
  4. 关于扫描仪——你不知道的秘密
  5. StringBuilder/StringBuffer类
  6. 利用SIFT和RANSAC算法(openCV框架)实现物体的检测与定位,并求出变换矩阵(findFundamentalMat和findHomography的比较)
  7. 到底死不死我就请了七天假_“你到底死不死?我只请了7天假”
  8. 陇东学院c语言程序设计,C语言程序设计
  9. pcl里面的3D特征
  10. 韩顺平php视频笔记37 php数据类型(部分)
  11. Contest-hunter 暑假送温暖 SRM08
  12. 解决安卓4.4webview的兼容性问题
  13. 线程池为啥要用阻塞队列
  14. ion orphaned memory
  15. 【火车头采集】如何采集一个网页的多张图片并且下载
  16. ospf在NBMA网络中的实验(保姆级别)
  17. 千氪财经|2018 上半年币圈漏洞与攻击盘点
  18. 深度学习中的BN_CBN_CmBN
  19. 用git push 命令向远端提交代码时遇到git everything up-to-date的问题解决
  20. 阿里携手分众打通线上线下全链路 U众计划品效协同双11转化大提升

热门文章

  1. 2021-2022半导体行业投资策略:矛盾与破局.pdf.
  2. java 集成grizzly_使用Grizzly的嵌入式Java服务器:如何启用http2
  3. 发几个mac高清壁纸,想要的拿去!
  4. 基于NLP的COVID-19虚假新闻检测
  5. python 绘制 频谱图
  6. 直线方程的点斜式、两点式、斜截式的公式是什么
  7. linux vad检测,VAD 文件扩展名: 它是什么以及如何打开它?
  8. java resultmap_mybatis: resultMap 结果集映射和多表查询
  9. 静态网页 爬虫实战(二)
  10. DOTA无法加载服务器指定的地图,Dota2自定义地图工具怎么安装_Dota2自定义地图工具常见问题处理方法...