日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 1246. 删除回文子数组(区间DP)

發布時間:2024/7/5 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 1246. 删除回文子数组(区间DP) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1. 題目
    • 2. 解題

1. 題目

給你一個整數數組 arr,每一次操作你都可以選擇并刪除它的一個 回文 子數組 arr[i], arr[i+1], ..., arr[j]( i <= j)。

注意,每當你刪除掉一個子數組,右側元素都會自行向前移動填補空位。

請你計算并返回從數組中刪除所有數字所需的最少操作次數。

示例 1: 輸入:arr = [1,2] 輸出:2示例 2: 輸入:arr = [1,3,4,1,5] 輸出:3 解釋:先刪除 [4],然后刪除 [1,3,1],最后再刪除 [5]。提示: 1 <= arr.length <= 100 1 <= arr[i] <= 20

來源:力扣(LeetCode) 鏈接:https://leetcode-cn.com/problems/palindrome-removal
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。

2. 解題

  • dp[i][j] 表示區間 [i,j] 的最少移除次數
  • 如果已知 dp[i][j],推導dp[i-1][j+1]
  • 如果兩側相等 arr[i-1] == arr[j+1],dp[i-1][j+1] = min(dp[i-1][j+1], dp[i][j])
  • 對區間而言,把區間分成任意的兩份,求和取最小
    對所有可能的 k,dp[i-1][j+1] = min(dp[i-1][j+1], dp[i-1][k]+dp[k+1][j+1])
class Solution { public:int minimumMoves(vector<int>& arr) {int n = arr.size(), i, j,k, len;vector<vector<int>> dp(n, vector<int>(n,INT_MAX));for(i = 0; i < n; ++i){dp[i][i] = 1;//初始化if(i < n-1 && arr[i]==arr[i+1])dp[i][i+1] = 1;else if(i < n-1 && arr[i]!=arr[i+1])dp[i][i+1] = 2;}for(len = 0; len < n; ++len){ //按長度遍歷for(i = 0; i < n; ++i){j = i+len;//右端點if(j >= n || dp[i][j]==INT_MAX) continue;if(i-1 >=0 && j+1 < n){for(k = i-1; k <= j; ++k)dp[i-1][j+1] = min(dp[i-1][j+1], dp[i-1][k]+dp[k+1][j+1]);if(arr[i-1] == arr[j+1])dp[i-1][j+1] = min(dp[i-1][j+1], dp[i][j]);} }}return dp[0][n-1];} };

440 ms 12.9 MB


我的CSDN博客地址 https://michael.blog.csdn.net/

長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!

總結

以上是生活随笔為你收集整理的LeetCode 1246. 删除回文子数组(区间DP)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。