2919. Minimum Increment Operations to Make Array
DFS+memo
```java
class Solution {
public long minIncrementOperations(int[] nums, int k) {
Long[] memo = new Long[nums.length];
return dfs(0, nums, k, memo);
}
private long dfs(int i, int[] nums, int k, Long[] memo) {
int n = nums.length;
if (i > n - 3) { //base case: not in subarray win -> return 0
return 0;
}
if (memo[i] != null) {
return memo[i];
}
// try to brute force DFS to get all values...but with memo -> DP
// option 1, how many ops at for reaching k, (k - current num)
// k - nums might < 0, ex: [1,1,2], k=1, this case, k - nums[i + 2] is -1
// so it means no operations! => use 0
long op1 = Math.max(0, k - nums[i]) + dfs(i + 1, nums, k, memo);
// option 2
long op2 = Math.max(0, k - nums[i + 1]) + dfs(i + 2, nums, k, memo);
// option 3
long op3 = Math.max(0, k - nums[i + 2]) + dfs(i + 3, nums, k, memo);
return memo[i] = Math.min(op1, Math.min(op2, op3));
}
}
/**
>=3
maxi >= k
result =
current index is i
op1 = max(0, k - num[i]) + dfs(i+1, ...)
or
op1 = max(0, k - num[i+1]) + dfs(i+2, ...)
or
op1 = max(0, k - num[i+2]) + dfs(i+3, ...)
MIN(op1, op2, op3)
*/
```DP
Last updated
Was this helpful?