|
1 | 1 | package g3401_3500.s3500_minimum_cost_to_divide_array_into_subarrays;
|
2 | 2 |
|
3 |
| -// #Hard #2025_03_30_Time_225_ms_(94.64%)_Space_62.54_MB_(58.93%) |
4 |
| - |
5 |
| -import java.util.Arrays; |
| 3 | +// #Hard #Array #Dynamic_Programming #Prefix_Sum |
| 4 | +// #2025_04_01_Time_26_ms_(93.46%)_Space_44.97_MB_(94.77%) |
6 | 5 |
|
7 | 6 | @SuppressWarnings("java:S107")
|
8 | 7 | public class Solution {
|
9 | 8 | public long minimumCost(int[] nums, int[] cost, int k) {
|
10 | 9 | int n = nums.length;
|
11 |
| - long[] prefixNums = new long[n]; |
12 |
| - long total = 0; |
13 |
| - for (int i = 0; i < n; i++) { |
14 |
| - total += nums[i]; |
15 |
| - prefixNums[i] = total; |
16 |
| - } |
17 |
| - long[] prefixCost = new long[n + 1]; |
18 |
| - total = 0; |
| 10 | + long kLong = (long) k; |
| 11 | + long[] preNums = new long[n + 1]; |
| 12 | + long[] preCost = new long[n + 1]; |
19 | 13 | for (int i = 0; i < n; i++) {
|
20 |
| - total += cost[i]; |
21 |
| - prefixCost[i + 1] = total; |
22 |
| - } |
23 |
| - long[][] memo = new long[n][n + 1]; |
24 |
| - for (long[] row : memo) { |
25 |
| - Arrays.fill(row, -1); |
26 |
| - } |
27 |
| - int[] bestSplit = new int[n]; |
28 |
| - Arrays.fill(bestSplit, -1); |
29 |
| - return rec(0, 1, nums, prefixNums, prefixCost, k, memo, bestSplit); |
30 |
| - } |
31 |
| - |
32 |
| - private long rec( |
33 |
| - int index, |
34 |
| - int i, |
35 |
| - int[] nums, |
36 |
| - long[] prefixNums, |
37 |
| - long[] prefixCost, |
38 |
| - int k, |
39 |
| - long[][] memo, |
40 |
| - int[] bestSplit) { |
41 |
| - int n = nums.length; |
42 |
| - if (index == n) { |
43 |
| - return 0; |
44 |
| - } |
45 |
| - if (memo[index][i] != -1) { |
46 |
| - return memo[index][i]; |
| 14 | + preNums[i + 1] = preNums[i] + nums[i]; |
| 15 | + preCost[i + 1] = preCost[i] + cost[i]; |
47 | 16 | }
|
48 |
| - if (bestSplit[index] != -1) { |
49 |
| - int j = bestSplit[index]; |
50 |
| - long val = |
51 |
| - (prefixNums[j] + (long) k * i) * (prefixCost[j + 1] - prefixCost[index]) |
52 |
| - + rec(j + 1, i + 1, nums, prefixNums, prefixCost, k, memo, bestSplit); |
53 |
| - memo[index][i] = val; |
54 |
| - return val; |
| 17 | + long[] dp = new long[n + 1]; |
| 18 | + for (int i = 0; i <= n; i++) { |
| 19 | + dp[i] = Long.MAX_VALUE / 2; |
55 | 20 | }
|
56 |
| - long best = Long.MAX_VALUE; |
57 |
| - int bestIndex = -1; |
58 |
| - for (int j = index; j < n; j++) { |
59 |
| - long val = |
60 |
| - (prefixNums[j] + (long) k * i) * (prefixCost[j + 1] - prefixCost[index]) |
61 |
| - + rec(j + 1, i + 1, nums, prefixNums, prefixCost, k, memo, bestSplit); |
62 |
| - if (val < best) { |
63 |
| - best = val; |
64 |
| - bestIndex = j; |
| 21 | + dp[0] = 0L; |
| 22 | + for (int r = 1; r <= n; r++) { |
| 23 | + for (int l = 0; l < r; l++) { |
| 24 | + long sumNums = preNums[r] * (preCost[r] - preCost[l]); |
| 25 | + long sumCost = kLong * (preCost[n] - preCost[l]); |
| 26 | + dp[r] = Math.min(dp[r], dp[l] + sumNums + sumCost); |
65 | 27 | }
|
66 | 28 | }
|
67 |
| - bestSplit[index] = bestIndex; |
68 |
| - memo[index][i] = best; |
69 |
| - return best; |
| 29 | + return dp[n]; |
70 | 30 | }
|
71 | 31 | }
|
0 commit comments