动态规划:合唱团问题解析(二)

牛客网网易的校招编程题

题目:有 n 个学生站成一排,每个学生有一个能力值,牛牛想从这 n 个学生中按照顺序选取 k 名学生,要求相邻两个学生的位置编号的差不超过 d,使得这 k 个学生的能力值的乘积最大,你能返回最大的乘积吗?
输入:每个输入包含
1 个测试用例。每个测试数据的第一行包含一个整数 n (1 <= n <= 50),表示学生的个数,接下来的一行,包含 n
个整数,按顺序表示每个学生的能力值 ai(-50 <= ai <= 50)。接下来的一行包含两个整数,k 和 d (1 <= k
<= 10, 1 <= d <= 50)。
输出:输出一行表示最大的乘积。

求解合唱团问题

在讨论了简化的问题之后,现在我们回过头来再看原问题,我们可以发现原问题就是在简化的问题上加了两个限制条件,一个是在这 n 个数中可以取到负值,另一个是取到的这 n 个数的索引值之间的差不能超过一个限定值 d。

对于第一个限制条件,我们必须考虑到当偶数个负值相乘时也可能产生最大的乘积,而能产生最大乘积的负数必然是其中最小的负数。所以我们可以以同样地动规方法开辟另一个空间去存储计算出的最小负值,然后在我们求最大值得时候,当选择了一个固定的值 n,我们必须从其与存储的最大值的积 (n*dpmax) 和存储的最小值的积 (n*dpmin) 中选出最大的值。同样地,我们必须更新存储最小负值的矩阵,当选择了一个固定的值 n,我们必须从其与存储的最大值的积和存储的最小值的积中选出最小的值。

对于第二个限制条件,只要修改向前搜索的最大值的范围就可以了,但要注意的是当这个范围越界的时候我们要做相应的处理。最终实现的代码如下所示:

 1 long long singProblem(int a[], int n, int k, int d) {
 2     vector<long long> dpmax = vector<long long>(n, 0);
 3     vector<long long> dpmin = vector<long long>(n, 0);
 4     long long result = 0;
 5     for (int j = 1; j < k + 1; j++) {
 6         for (int i = 0; i < n; i++) {
 7             if (j == 1) {
 8                 dpmax[i] = a[i];
 9                 dpmin[i] = a[i];
10             }
11             else {
12                 for (int index = i + 1; index <= min(i + d, n - 1); index++) {
13                     dpmax[i] = max(dpmax[i], max(a[i] * dpmax[index], a[i] * dpmin[index]));
14                     dpmin[i] = min(dpmin[i], min(a[i] * dpmax[index], a[i] * dpmin[index]));
15                 }
16             }
17             if (j == k) result = max(result, dpmax[i]);
18         }
19     }
20     return result;
21 }

原文地址:https://www.cnblogs.com/ToBeDeveloper-Zhen/p/8531445.html

时间: 2024-10-22 16:53:20

动态规划:合唱团问题解析(二)的相关文章

ZXing解析二维码

上一篇文件已经说过如何用ZXing进行生成二维码和带图片的二维码,下面说下如何解析二维码 二维码的解析和生成类似,也可以参考google的一个操作类 BufferedImageLuminanceSource类,该类可在google的测试包中找到,另外j2se中也有该类,你可以将该类直接拷贝到源码中使用,你也可以自己写个. import java.awt.Graphics2D; import java.awt.geom.AffineTransform; import java.awt.image.

Java使用QRCode.jar生成与解析二维码

正题:Java使用QRCode.jar生成与解析二维码demo 欢迎新手共勉,大神监督指正 # 不知道QRCode的请移步wiki,自行了解,这里不多做解释 *******创建二维码之前的工作******** 去下面给出的地址下载QRCode.jar包,此jar包已经包括 生成与解析 . 官网下载到的jar包是没有解析的 https://files.cnblogs.com/files/bigroc/QRCode.zip ***创建好你的测试类导好jar包开始吧*** 第一部分:生成二维码 pac

使用zxing生成和解析二维码

二维码: 是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的: 在代码编制上巧妙的利用构成计算机内部逻辑基础的0和1比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图像输入设备或光电扫描设备自动识读以实现信息自动处理: 二维码能够在横向和纵向两个方位同时表达信息,因此能在很小的面积内表达大量的信息: 二维码相对于条形码的优势就是省空间: zxing简介: zxing是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库

C#使用zxing,zbar,thoughtworkQRcode解析二维码,附源代码

最近做项目需要解析二维码图片,找了一大圈,发现没有人去整理下开源的几个库案例,花了点时间 做了zxing,zbar和thoughtworkqrcode解析二维码案例,希望大家有帮助. zxing是谷歌开源的二维码库,zbar,thoughtworkQRcode也是开源的,三者之间比较各有优劣 下面通过一个案例demo源码,来认识学习下这三者的实际解码效果, 第一次上传demo源码,献丑了 zbar解析关键代码: Image primaryImage = Image.FromFile(fileNa

Spring 源码解析之HandlerAdapter源码解析(二)

Spring 源码解析之HandlerAdapter源码解析(二) 前言 看这篇之前需要有Spring 源码解析之HandlerMapping源码解析(一)这篇的基础,这篇主要是把请求流程中的调用controller流程单独拿出来了 解决上篇文章遗留的问题 getHandler(processedRequest) 这个方法是如何查找到对应处理的HandlerExecutionChain和HandlerMapping的,比如说静态资源的处理和请求的处理肯定是不同的HandlerMapping ge

Java使用Zxing生成、解析二维码工具类

Zxing是Google提供的关于条码(一维码.二维码)的解析工具,提供了二维码的生成与解析的方法. 1.二维码的生成 (1).将Zxing-core.jar 包加入到classpath下. (2).二维码的生成需要借助MatrixToImageWriter类,该类是由Google提供的; package com.qlwb.business.util; //导入省略... /** * 二维码工具类 * */ public class MatrixToLogoImageWriter { priva

APS.NET MVC4生成解析二维码简单Demo

一.视图 @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Index</title> <script src="~/Scripts/jquery-1.8.2.min.js"></scri

Android Bitmap 全面解析(二)加载多张图片的缓存处理

一般少量图片是很少出现OOM异常的,除非单张图片过~大~ 那么就可以用教程一里面的方法了通常应用场景是listview列表加载多张图片,为了提高效率一般要缓存一部分图片,这样方便再次查看时能快速显示~不用重新下载图片但是手机内存是很有限的~当缓存的图片越来越多,即使单张图片不是很大,不过数量太多时仍然会出现OOM的情况了~本篇则是讨论多张图片的处理问题-----------------------------------------------------------------------图片

马程序员学习笔记——红黑树解析二

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 四.树中删除元素 1.先找到需要删除的元素. 2. 2.1如果被删元素没有子元素,那么直接用NIL节点代替他: 2.2如果被删元素只有一个子元素,那么直接用这个子元素代替他: 2.3如果被删元素有两个子元素,那么就用左子元素中的最大元素或者右子元素的最小元素代替他. 比如说原来要删除的元素是N,N有两个分支,其中P是N左分支中的最大元素,那么就

解析二维码

package www.ablanxue.com; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import jp.sourceforge.qrcode.QRCodeDecoder; import jp.sourceforge.qrcode.exception.DecodingFailedException;