In one move, you can select a palindromic subarray arr[i], arr[i + 1], ..., arr[j] where i <= j, and remove that subarray from the given array. Note that after removing a subarray, the elements on the left and on the right of that subarray move to fill the gap left by the removal.
Return the minimum number of moves needed to remove all numbers from the array.
Example 1:
Input: arr = [1,2]
Output: 2
Example 2:
Input: arr = [1,3,4,1,5]
Output: 3
Explanation: Remove [4] then remove [1,3,1] then remove [5].
Constraints:
1 <= arr.length <= 100
1 <= arr[i] <= 20
Solutions
Solution 1: Dynamic Programming (Interval DP)
Thinking
Each move deletes a palindromic subarray. \(n \le 100\). Optimal substructure on intervals suggests DP: \(f[i][j]\) is the fewest moves to clear \(arr[i..j]\).
Equal ends may vanish with the inner interval; otherwise we split at \(k\) and clear the two sides separately. Filling by interval length makes shorter intervals ready. \(n^3\) is acceptable at \(n=100\).
We define \(f[i][j]\) as the minimum number of operations required to delete all numbers in the index range \([i,..j]\). Initially, \(f[i][i] = 1\), which means that when there is only one number, one deletion operation is needed.
For \(f[i][j]\), if \(i + 1 = j\), i.e., there are only two numbers, if \(arr[i]=arr[j]\), then \(f[i][j] = 1\), otherwise \(f[i][j] = 2\).
For the case of more than two numbers, if \(arr[i]=arr[j]\), then \(f[i][j]\) can be \(f[i + 1][j - 1]\), or we can enumerate \(k\) in the index range \([i,..j-1]\), take the minimum value of \(f[i][k] + f[k + 1][j]\). Assign the minimum value to \(f[i][j]\).
The answer is \(f[0][n - 1]\).
The time complexity is \(O(n^3)\), and the space complexity is \(O(n^2)\). Where \(n\) is the length of the array.