合唱团

题目描述

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

输入描述:

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

i

(-50 <= ai <= 50)。接下来的一行包含两个整数,k 和 d (1 <= k <= 10, 1 <= d <= 50)。
 1 import java.io.BufferedReader;
 2 import java.io.InputStreamReader;
 3 
 4 public class Main{
 5     public static void main(String[] args) throws Exception {
 6         BufferedReader read=new BufferedReader(new InputStreamReader(System.in));
 7         int n=Integer.parseInt(read.readLine());
 8         int [] nums=new int[n];
 9         String []xz=read.readLine().split(" ");
10         for(int i=0;i<n ; i++){
11           nums[i]=Integer.parseInt(xz[i]);
12         }
13         String []dsl=read.readLine().split(" ");
14         int k = Integer.parseInt(dsl[0]);
15         int d=Integer.parseInt(dsl[1]);
16         long [][]min=new long[k][n];
17         long [][]max=new long[k][n];
18         long fs=0;
19         for(int i =0; i<k;i++){
20             for(int j=0;j<n;j++){
21                 if(i==0){
22                     min[0][j]=nums[j];
23                     max[0][j]=nums[j];
24                 }else{
25                     min[i][j]=1;
26                     max[i][j]=1;
27                 }
28                 for(int m=1;m<=d;m++){
29                     if(j>=m){
30                         if(i>0){
31                             if(nums[j]>0){
32                                 min[i][j]=Math.min(min[i][j],min[i-1][j-m]*nums[j]);
33                                 max[i][j]=Math.max(max[i][j], max[i-1][j-m]*nums[j]);
34                             }else{
35                                 min[i][j]=Math.min(min[i][j],max[i-1][j-m]*nums[j]);
36                                 max[i][j]=Math.max(max[i][j], min[i-1][j-m]*nums[j]);
37                             }
38                         }
39                     }
40                     if(i==k-1&&j>=k-1){
41                         fs=Math.max(fs, max[i][j]);
42                     }
43                     
44                 }
45             }
46         }
47         System.out.println(fs);  
48     }
49 }

 

posted @ 2018-05-05 22:39  烈痕  阅读(118)  评论(0)    收藏  举报