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?