网易合唱团
This commit is contained in:
parent
2fb7dfb2df
commit
5494c1d488
63
code/src/main/java/com/raorao/nowcoder/HeChangTuan.java
Normal file
63
code/src/main/java/com/raorao/nowcoder/HeChangTuan.java
Normal file
@ -0,0 +1,63 @@
|
||||
package com.raorao.nowcoder;
|
||||
|
||||
import java.util.Scanner;
|
||||
|
||||
/**
|
||||
* 牛客网:合唱团问题
|
||||
*
|
||||
* https://www.nowcoder.com/questionTerminal/661c49118ca241909add3a11c96408c8?orderByHotValue=1&mutiTagIds=593&page=1&onlyReference=false.
|
||||
*
|
||||
* @author Xiong Raorao
|
||||
* @since 2018-09-06-23:21
|
||||
*/
|
||||
public class HeChangTuan {
|
||||
|
||||
public static void main(String[] args) {
|
||||
Scanner scanner = new Scanner(System.in);
|
||||
int n = scanner.nextInt();
|
||||
int[] a = new int[n + 1];
|
||||
for (int i = 1; i < n + 1; i++) {
|
||||
a[i] = scanner.nextInt();
|
||||
}
|
||||
int kk = scanner.nextInt();
|
||||
int dd = scanner.nextInt();
|
||||
|
||||
// 规划数组
|
||||
long[][] f = new long[n + 1][kk + 1];
|
||||
long[][] g = new long[n + 1][kk + 1];
|
||||
|
||||
//初始化k = 1
|
||||
for (int one = 1; one <= n; one++) {
|
||||
f[one][1] = a[one];
|
||||
g[one][1] = a[one];
|
||||
}
|
||||
|
||||
// 自底向上递推
|
||||
for (int k = 2; k <= kk; k++) {
|
||||
for (int one = k; one <= n; one++) {
|
||||
// 求解当one和k定下来的时候,最大的分割点
|
||||
long tempMax = Long.MIN_VALUE;
|
||||
long tempMin = Long.MAX_VALUE;
|
||||
for (int left = Math.max(k - 1, one - dd); left <= one - 1; left++) {
|
||||
if (tempMax < Math.max(f[left][k - 1] * a[one], g[left][k - 1] * a[one])) {
|
||||
tempMax = Math.max(f[left][k - 1] * a[one], g[left][k - 1] * a[one]);
|
||||
}
|
||||
if (tempMin > Math.min(f[left][k - 1] * a[one], g[left][k - 1] * a[one])) {
|
||||
tempMin = Math.min(f[left][k - 1] * a[one], g[left][k - 1] * a[one]);
|
||||
}
|
||||
f[one][k] = tempMax;
|
||||
g[one][k] = tempMin;
|
||||
}
|
||||
}
|
||||
}
|
||||
//n选k最大的需要从最后一个最大的位置选
|
||||
long result = Long.MIN_VALUE;
|
||||
for (int one = kk; one <= n; one++) {
|
||||
if (result < f[one][kk]) {
|
||||
result = f[one][kk];
|
||||
}
|
||||
}
|
||||
System.out.println(result);
|
||||
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user