---
# System prepended metadata

title: 1246. Palindrome Removal
tags: [Leetcode, Dynamic Programming, Hard]

---

# 1246. Palindrome Removal
###### tags: `Leetcode` `Hard` `Dynamic Programming`
Link: https://leetcode.com/problems/palindrome-removal/
## 思路
![](https://i.imgur.com/0rPp7vC.png)
ppt里面写错了 如果```i==j``` 那么```dp[i][j]=1```
如果缩小到子问题之后找不到突破口，就从子问题的最后一个元素下手
例如这道题就是在子问题里面找和最后一个元素相等的元素
如果找到了一个元素 ```arr[k]```和```arr[j]```相等 那么说明这两个元素可以和```arr[k+1][j-1]```同一批被消掉(例如如果是```[1,2,3,1]```, 只考虑```[2,3]```，会发现需要两次操作，但是如果删完3之后，```[1,2,1]```可以在一次操作里面被删掉)
这里之所以需要写```Math.max(1, dp[k+1][j-1])```是因为有可能```k+1```和```j-1```本来就是相邻的 那么还是需要一个操作才能把他们消掉的
## Code
```java=
class Solution {
    public int minimumMoves(int[] arr) {
        int n = arr.length;
        int[][] dp = new int[n+2][n+2];
        for(int len=1; len<=n; len++){
            for(int i=1; i+len-1<=n; i++){
                int j = i+len-1;
                dp[i][j] = Integer.MAX_VALUE;
                for(int k=i; k<=j; k++){
                    if(arr[k-1]==arr[j-1]){
                        dp[i][j] = Math.min(dp[i][j], dp[i][k-1]+Math.max(1, dp[k+1][j-1]));
                    }
                }
            }
        }
        return dp[1][n];
    }
}
```