|
1 | 1 | package g3401_3500.s3469_find_minimum_cost_to_remove_array_elements;
|
2 | 2 |
|
3 |
| -// #Medium #2025_03_02_Time_540_ms_(100.00%)_Space_57.03_MB_(100.00%) |
| 3 | +// #Medium #2025_03_05_Time_12_ms_(100.00%)_Space_45.56_MB_(96.22%) |
4 | 4 |
|
5 | 5 | import java.util.Arrays;
|
6 | 6 |
|
7 | 7 | public class Solution {
|
8 |
| - private int[][] dp; |
| 8 | + private static final int INF = (int) 1e9; |
9 | 9 |
|
10 | 10 | public int minCost(int[] nums) {
|
11 |
| - dp = new int[1001][1001]; |
12 |
| - Arrays.stream(dp).forEach(row -> Arrays.fill(row, -1)); |
13 |
| - return solve(nums, 1, 0); |
14 |
| - } |
15 |
| - |
16 |
| - private int solve(int[] nums, int i, int last) { |
17 |
| - if (i + 1 >= nums.length) { |
18 |
| - return Math.max(nums[last], (i < nums.length ? nums[i] : 0)); |
| 11 | + int n = nums.length; |
| 12 | + if (n % 2 == 0) { |
| 13 | + nums = Arrays.copyOf(nums, ++n); |
| 14 | + } |
| 15 | + int[] dp = new int[n]; |
| 16 | + for (int j = 1; j < n - 1; j += 2) { |
| 17 | + int cost1 = INF; |
| 18 | + int cost2 = INF; |
| 19 | + int max = Math.max(nums[j], nums[j + 1]); |
| 20 | + for (int i = 0; i < j; ++i) { |
| 21 | + cost1 = Math.min(cost1, dp[i] + Math.max(nums[i], nums[j + 1])); |
| 22 | + cost2 = Math.min(cost2, dp[i] + Math.max(nums[i], nums[j])); |
| 23 | + dp[i] += max; |
| 24 | + } |
| 25 | + dp[j] = cost1; |
| 26 | + dp[j + 1] = cost2; |
19 | 27 | }
|
20 |
| - if (dp[i][last] != -1) { |
21 |
| - return dp[i][last]; |
| 28 | + int result = INF; |
| 29 | + for (int i = 0; i < n; ++i) { |
| 30 | + result = Math.min(result, dp[i] + nums[i]); |
22 | 31 | }
|
23 |
| - int res = Math.max(nums[i], nums[i + 1]) + solve(nums, i + 2, last); |
24 |
| - res = Math.min(res, Math.max(nums[i], nums[last]) + solve(nums, i + 2, i + 1)); |
25 |
| - res = Math.min(res, Math.max(nums[i + 1], nums[last]) + solve(nums, i + 2, i)); |
26 |
| - dp[i][last] = res; |
27 |
| - return res; |
| 32 | + return result; |
28 | 33 | }
|
29 | 34 | }
|
0 commit comments