(动态规划)有 n 个学生站成一排,每个学生有一个能力值,从这 n 个学生中按照顺序选取kk 名学生,要求相邻两个学生的位置编号的差不超过 d,使得这 kk 个学生的能力值的乘积最大,返回最大的乘积
第2关:最强战队
挑战任务
绿盟和各大名企合作,举办编程能力大赛,需要选拔一支参赛队伍。队伍成员全部来自“绿盟杯”中表现优秀的同学,每个同学都根据在比赛中的表现被赋予了一个能力值。现在被召集的N个同学已经集结完毕,他们按照编号依次站成了一排。
你需要编写一个程序,从这N个同学中选出S个同学,要求选出的同学的能力值的乘积最大,且要求被选出的相邻两个同学的编号的差不超过D。
编程要求
补全右侧代码区中的getBestTeams(int n,int a[],int kk, int d)函数,实现找出能力值乘积最大而且满足编号要求的同学。将最终结果作为返回值返回,函数参数说明如下:
int n 召集到的同学的人数int a[] 各个同学的能力值(依次对应不同编号的同学,数组的index就是学生的编号)int kk 需要选出的同学的人数int d 相邻同学的编号的差的最大值
测试说明
样例1:
输入:3 , [7,4,7] , 2 , 50
输出:49
动态规划,这个是算法里面一直比较难的,当我拿到这个题的时候,有点难以下手,虽然知道要用动态规划但是如何用,自己完全不知道,首先想到找出这个n个数中k个最大的相乘 ,但是很遗憾不对,①要求相邻两个学生之间的编号差不能超过d,②能力值存在负数。
动态规划是要将问题分解若干子问题,同时子问题之间可能存在包含,我们通常需要保存子问题的结果。
怎么保存了?数组f[n][m]表示选了n个人方案,最后一的位置为m,那f[n-1][p]就表示选了n-1个人,最后一个位置为p
怎么分解呢?首先m个人中选n个编号差要求<=d,若已经知道选n-1人的方案,同时这个方案最后一个人的位置为p,我们只需要遍历p+1到p+d的位置求得第n个人的位置。选n个人实际上不知道哪一个作为结尾所以会遍历的求f[n][1]~f[n][m]的最大值
有负数怎么办?因为有负数所以我们在加一个数组fmin[n][m]表示m个人中选n个间隔为d最小的乘积,最小的也可能成为最大的。
#include<stdio.h>
#include<ctype.h>
#include<string.h>
#include<stdlib.h>
#include<limits.h>
#include<math.h>
#include<algorithm>
#include<iostream>
using namespace std;
int getBestTeams(int n,int a[],int kk,int d){
long long res=0;
long long int fmax[11][51]={0};
long long int fmin[11][51]={0};
for(int j=1;j<=kk;j++){
for(int i=1;i<=n;i++){
if(j==1){
fmax[j][i]=a[i];
fmin[j][i]=a[i];
}
else{
for(int p=1;p<=d;p++)
if(i-p>=1&&i-p<=n){
fmax[j][i]=max(fmax[j][i],max(fmax[j-1][i-p]*a[i],fmin[j-1][i-p]*a[i]));
fmin[j][i]=min(fmin[j][i],min(fmax[j-1][i-p]*a[i],fmin[j-1][i-p]*a[i]));
}
}
res=max(res,fmax[kk][i]);
}
}
return res;
}
int main(){
int n,a[51]={0},kk,d;
while(cin>>n&&n){
for(int i=1;i<=n;i++)
cin>>a[i];
cin>>kk>>d;
cout<<getBestTeams(n,a,kk,d)<<endl;
}
return 0;
}
(动态规划)有 n 个学生站成一排,每个学生有一个能力值,从这 n 个学生中按照顺序选取kk 名学生,要求相邻两个学生的位置编号的差不超过 d,使得这 kk 个学生的能力值的乘积最大,返回最大的乘积的更多相关文章
- (LeetCode 135) Candy N个孩子站成一排,给每个人设定一个权重
原文:http://www.cnblogs.com/AndyJee/p/4483043.html There are N children standing in a line. Each child ...
- hdu2049 不容易系列之(4)——考新郎 错排+组合 一共有N对新婚夫妇,N个新娘随机坐成一排,每个新郎只能选一个, 其中有M个新郎找错了新娘,求发生这种情况一共有多少种可能.
不容易系列之(4)——考新郎 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- 求最长的任意两元素差不超过M的子段——双指针+单调队列hdu4123
换根dp的部分比较容易,难点在于求求最长的任意两元素差不超过M的子段 首先会想到双指针维护(尺取法),如果p1,p2间的max-min>M,那么p1向右移动,直到p1,p2间的max-min&g ...
- 前x个数据中至少有m个元素最小值与最大值之差不超过K
题意 给一组数据,从左到右开始,寻找最小的x,使得第1个元素到第x个元素中,至少存在m个数据,最小值与最大值之差不超过K. INPUT 第一行是T,代表数据组数 每组数据的第一行是三个整数,n.m.k ...
- HDU 1171 Big Event in HDU【01背包/求两堆数分别求和以后的差最小】
Big Event in HDU Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) T ...
- Javascript之旅——第八站:说说instanceof踩了一个坑
前些天写js遇到了一个instanceof的坑,我们的页面中有一个iframe,我在index页面中计算得到了一个array,然后需要传递到Flight页面 这个嵌套的iframe中的一个函数(Sea ...
- Java计算两个字符串日期之间的天数差
Java计算两个字符串日期之间的天数差 调用方法: public static void main(String[] args) throws ParseException { String a = ...
- 如何将BSP应用配置成Fiori Launchpad上的一个tile
当我们通过WebIDE或者Eclipse的插件Team Provider把一个本地开发好的UI5应用部署到了ABAP Netweaver服务器上之后,我们可以将该UI5应用配置成Fiori launc ...
- impala 四舍五入后转换成string后又变成一个double的数值解决(除不尽的情况)
impala 四舍五入后转换成string后又变成一个double的数值解决(除不尽的情况)例如Query: select cast(round(2 / 3, 4)*100 as string)+-- ...
随机推荐
- bzoj2002 弹飞绵羊
Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置 ...
- Java-Web中访问某个指定工程中的文件,报错后发现访问的文件是另一个工程里面的文件
问题: 浏览器向我的bingou项目中的UserDaoImpl.java发送请求, myeclipse报错:空指针异常 点击报错行之后,错误给定位到了另一个项目中的的一个文件 解决: 原因是文件名错误 ...
- IE浏览器中overflow:hidden无效,内层元素超出外层div的解决方法
原文地址:http://www.xin126.cn/show.asp?id=2624 在用css布局的时候,用IE浏览器(ie6.ie7.ie8)预览,有时候会出现内层元素(内部DIV.图片等)超出外 ...
- wordpress模板里加keywords和description
刚才我说了,wp会弄的话,功能是很强大的,插件很多,基本上你能想到的功能,插件都开发好了的.现在就来说说这个keywords和description的问题.我在网上找了些资料,总结一下,如果有引用到的 ...
- Linux之 AWK SED
AWK系列#awk 中 NF表示取最后一列 NR表示取第几行 NR==3 表示取第三行[root@nodchen-db01-test ~]# free -m | awk 'NR==3 {print $ ...
- Linux期中架构 全网备份案例
server端脚本 #!/bin/bash #1 进行数据完整性验证 并生成结果 find /backup -type f -name "finger.txt"| xargs md ...
- 1067 Sort with Swap(0, i) (25 分)
1067 Sort with Swap(0, i) (25 分) Given any permutation of the numbers {0, 1, 2,..., N−1}, it is easy ...
- [UE4]C++创建对象的三种方式
#include <iostream> using namespace std; class A { private: int n; public: A(int m):n(m) { } ~ ...
- linux 下各个4K区块文件大小测试速度对比 机械硬盘性能 64K性价比收益最高
机械硬盘,每个区块取三次数最小值为准,带2G RAM缓存卡 4K3.4 MB/秒 8K7.3 MB/秒 16K9.5 MB/秒 32K16.7 MB/秒 64K44.2 MB/秒 128K67.1 M ...
- IIS6.0 IIS7.5应用程序池自动停止的解决方法 搜集整理
来源:http://www.guchengnet.com/1499.html IIS6.0 IIS7.5应用程序池自动停止的解决方法 搜集整理 发表于2016年12月14日 有2.3个月没有用本地的i ...