fork download
  1. import java.util.Scanner;
  2. import java.util.Arrays;
  3.  
  4. public class Main {
  5. public static void main(String[] args) {
  6. Scanner scanner = new Scanner(System.in);
  7. int n = scanner.nextInt();
  8. int k = scanner.nextInt();
  9. int m = n - k; // 需要保留的歌曲数量
  10.  
  11. if (m == 0) {
  12. System.out.println(0);
  13. return;
  14. }
  15.  
  16. long[] a = new long[n];
  17. for (int i = 0; i < n; i++) {
  18. a[i] = scanner.nextLong();
  19. }
  20.  
  21. // dp[i][j] 表示前i首歌中保留j首的最小等待时间
  22. long[][] dp = new long[n+1][m+1];
  23. for (long[] row : dp) {
  24. Arrays.fill(row, Long.MAX_VALUE);
  25. }
  26. dp[0][0] = 0;
  27.  
  28. for (int i = 1; i <= n; i++) {
  29. for (int j = 0; j <= Math.min(i, m); j++) {
  30. // 不选当前歌曲
  31. if (dp[i-1][j] != Long.MAX_VALUE) {
  32. dp[i][j] = dp[i-1][j];
  33. }
  34. // 选当前歌曲
  35. if (j > 0 && dp[i-1][j-1] != Long.MAX_VALUE) {
  36. long newVal = dp[i-1][j-1] + (j-1) * a[i-1];
  37. if (newVal < dp[i][j]) {
  38. dp[i][j] = newVal;
  39. }
  40. }
  41. }
  42. }
  43.  
  44. System.out.println(dp[n][m]);
  45. }
  46. }
Success #stdin #stdout 0.17s 54568KB
stdin
3 0
1 2 3
stdout
8