【LeetCode】:刪除回文子數組【困難】

在這里插入圖片描述
在這里插入圖片描述

class Solution {
public:// 思考:能否用滾動數組進行優化int minimumMoves(vector<int>& arr) {// 定義狀態dp[i][j]為i-j的最小步數int n = arr.size();vector<vector<int>> dp(n, vector<int>(n, 1e9 + 7));// 可以把這 1 次理解為一種 最小操作單位 或者// 基準操作次數后續計算更長的子數組的最小移動次數時// 都是基于這個基準進行遞推和比較的 如果將單個元素的情況定義為 0 次// 那么在后續的狀態轉移計算中// 可能會出現邏輯上的不順暢或者需要額外的特殊處理來區分這種情況// 反而會使算法變得復雜和難以理解for (int i = 0; i < n; ++i) {dp[i][i] = 1;}for (int i = 0; i + 1 < n; ++i) {if (arr[i] == arr[i + 1]) {dp[i][i + 1] = 1;} else {dp[i][i + 1] = 2;}}// 前面解決的是長度為2的子數組;// 現在解決的是長度為3及其以上的子數組的最小移動次數;for (int step = 3; step <= n; ++step) {// i+step-1表示索引的位置是從0位置到2及其以上的位置;for (int i = 0; i + step - 1 < n; ++i) {int j = i + step - 1;for (int k = i; k < j; ++k) {dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j]);}if (arr[i] == arr[j]) {// 如果arr[i] == arr[j] 則dp[i][j] = min(dp[i][j] dp[i +// 1][j - 1]) 這是因為當子數組的首尾元素相同時// 可以考慮將首尾元素之外的子數組[i + 1, j -// 1]變為相同元素,然后首尾元素自然就相同了// 取這種情況下的最小移動次數與當前dp[i][j]的值比較// 取較小值更新dp[i][j]dp[i][j] = min(dp[i][j], dp[i + 1][j - 1]);}}}return dp[0][n - 1];}
};// 以下是這段代碼中狀態表示這樣定義的原因:
// 一、全面覆蓋問題的子問題空間
// 定義 dp[i][j] 表示將數組 arr 中從索引 i 到索引 j
// 的子數組變為相同元素所需的最小移動次數,這種二維的狀態表示能夠涵蓋數組的所有子數組情況。
// 從單個元素的子數組(i = j)到整個數組(i = 0,j = n - 1,其中 n
// 是數組長度),通過這種方式可以系統地考慮和處理每一種可能的子數組組合,確保不會遺漏任何一種情況,為求解整個問題提供了全面的基礎。
// 二、便于狀態轉移和遞推計算
// 在計算 dp[i][j]
// 的過程中,需要基于更短的子數組的狀態來推導。例如,通過枚舉分割點 k(i <= k <
// j),將 [i, j] 子數組分為 [i, k] 和 [k + 1, j] 兩部分,此時 dp[i][k] 和 dp[k
// + 1][j] 就是已經計算過的更短子數組的狀態。
// 這種二維狀態表示使得在進行狀態轉移時,可以很方便地根據子數組的分割關系來建立狀態之間的聯系,通過取
// dp[i][k] + dp[k + 1][j] 的最小值等方式來更新
// dp[i][j],符合動態規劃中通過子問題的最優解來構建更大問題最優解的思想。
// 三、與問題的求解目標緊密相關
// 最終問題是求將整個數組變為相同元素的最小移動次數,而 dp[0][n - 1]
// 正好對應了這個最終目標。通過逐步計算從單個元素到整個數組的所有子數組的狀態,最終能夠得到
// dp[0][n - 1] 的值,即整個問題的解。
// 這種狀態表示方式直接針對問題的核心需求,將問題的求解過程轉化為對一系列子數組狀態的計算和更新,使得算法的設計和實現能夠緊密圍繞問題的本質,提高算法的針對性和有效性。// bool isPalindrome(const std::vector<int>& arr, int start, int end) {
//     while (start < end) {
//         if (arr[start] != arr[end]) {
//             return false;
//         }
//         start++;
//         end--;
//     }
//     return true;
// }// int minimumMoves(std::vector<int>& arr) {
//     int n = arr.size();
//     std::vector<int> dp(n, n);
//     dp[0] = 1;
//     for (int i = 1; i < n; ++i) {
//         dp[i] = dp[i - 1] + 1;
//         for (int j = 0; j < i; ++j) {
//             if (isPalindrome(arr, j, i)) {
//                 dp[i] = std::min(dp[i], (j > 0 ? dp[j - 1] : 0) + 1);
//             }
//         }
//     }
//     return dp[n - 1];

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/65881.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/65881.shtml
英文地址,請注明出處:http://en.pswp.cn/web/65881.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ChatGPT入門之文本情緒識別:先了解LSTM如何處理文字序列

文章目錄 0. 首先聊聊什么是RNN1. 理解LSTM&#xff0c;從數據如何喂給 LSTM開始2. LSTM每個門是如何處理序列數據的&#xff1f;2.1 遺忘門&#xff08;Forget Gate&#xff09;&#xff1a;該忘掉哪些信息&#xff1f;2.2 輸入門&#xff08;Input Gate&#xff09;&#xff…

AI學習路線圖-邱錫鵬-神經網絡與深度學習

1 需求 神經網絡與深度學習 2 接口 3 示例 4 參考資料

C#用直線和曲線抗鋸齒

使用 GDI 繪制一條線時&#xff0c;要提供線條的起點和終點&#xff0c;但不必提供有關線條上各個像素的任何信息。 GDI 與顯示驅動程序軟件協同工作&#xff0c;確定將打開哪些像素以在特定顯示設備上顯示該線條。 效果對比 代碼實現 關鍵代碼 e.Graphics.SmoothingMode Sm…

【opencv】第8章 圖像輪廓與圖像分割修復

8.1 查找并繪制輪廓 一個輪廓一般對應一系列的點&#xff0c;也就是圖像中的一條曲線。其表示方法可能 根據不同的情況而有所不同。在OpenCV 中&#xff0c;可以用findContours()函數從二值圖 像中查找輪廓 8.1.1 尋找輪廓&#xff1a; findContours() 函數 findContours) 函…

基于文件系統分布式鎖原理

分布式鎖&#xff1a;在一個公共的存儲服務上打上一個標記&#xff0c;如Redis的setnx命令&#xff0c;是先到先得方式獲得鎖&#xff0c;ZooKeeper有點像下面的demo,比較大小的方式判決誰獲得鎖。 package com.ldj.mybatisflex.demo;import java.util.*; import java.util.co…

Unity 大地圖功能 離線瓦片地圖

不使用第二個攝像機實現類似開放世界的大地圖功能。 功能如下&#xff1a; 按下M鍵打開/關閉大地圖功能 打開大地圖時&#xff0c;默認玩家位置居中 大地圖支持拖拽&#xff0c;可調節拖拽速度&#xff0c;支持XY軸翻轉 支持大地圖設置邊緣偏移量 可設置是否啟動拖拽邊界 …

Bootstrap 前端 UI 框架

Bootstrap官網&#xff1a;Bootstrap中文網 鉑特優選 Bootstrap 下載 點擊進入中文文檔 點擊下載 生產文件是開發響應式網頁應用&#xff0c;源碼是底層邏輯代碼&#xff0c;因為是要制作響應式網頁&#xff0c;所以下載開發文件 引入 css 文件&#xff0c; bootstrap.css 和 …

記一次sealos部署k8s集群之delete了第一臺master如何恢復

記一次sealos部署k8s集群之delete了第一臺master如何恢復 一、背景描述 使用sealos部署了一套K8S集群 master信息:172.27.100.1、172.27.100.2、172.27.100.3 node信息:172.27.100.4、172.27.100.5 sealos安裝在172.27.100.1節點,根目錄下/root/.sealos/文件還在! [root…

error: linker `link.exe` not found

開始學習rust&#xff0c;安裝好rust的環境&#xff0c;開始從hello world開始&#xff0c;結果用在win10環境下&#xff0c;使用vs code或cmd窗口編譯rust報錯&#xff1a; PS E:\study_codes\rust-demo\chart01> rustc hello.rs error: linker link.exe not found| note:…

用 HTML5 Canvas 和 JavaScript 實現雪花飄落特效

這篇文章將帶您深入解析使用 HTML5 Canvas 和 JavaScript 實現動態雪花特效的代碼原理。 1,效果展示 該效果模擬了雪花從天而降的動態場景,具有以下特點: 雪花數量、大小、透明度和下落速度隨機。雪花會在屏幕底部重置到頂部,形成循環效果。隨窗口大小動態調整,始終覆蓋…

django基于Python的校園個人閑置物品換購平臺

Django 基于 Python 的校園個人閑置物品換購平臺 一、平臺概述 Django 基于 Python 的校園個人閑置物品換購平臺是專為校園師生打造的一個便捷、環保且充滿活力的線上交易場所。它借助 Django 這一強大的 Python Web 開發框架&#xff0c;整合了校園內豐富的閑置物品資源&…

【Vim Masterclass 筆記10】S06L23:Vim 核心操作訓練之 —— 文本的搜索、查找與替換操作(第二部分)

文章目錄 S06L23 Search, Find, and Replace - Part Two1 文本替換命令 :s/old/new/2 指定范圍的文本替換3 特例&#xff1a;路徑的替換4 文件行號的配置5 要點總結&#xff08;1&#xff09;搜索當前行&#xff08;Same Line Searching&#xff09;&#xff08;2&#xff09;跨…

【計算機網絡】課程 實驗五 靜態路由配置

實驗五 靜態路由配置 一、實驗目的 理解靜態路由的工作原理&#xff0c;掌握如何配置靜態路由。 二、實驗分析與設計 【背景描述】 假設校園網分為 2 個區域&#xff0c;每個區域內使用 1 臺路由器連接 2 個子網&#xff0c; 現要在路由器上 做適當配置&#xff0c;實現校…

Python 繼承示例:有與無 `super().__init__()` 的區別

文章目錄 Python 繼承示例&#xff1a;有與無 super().__init__() 的區別父類&#xff08;Parent&#xff09;子類&#xff08;Child&#xff09;不調用 super().__init__()子類&#xff08;Child&#xff09;調用 super().__init__() Python 繼承示例&#xff1a;有與無 super…

Linux下部署Redis(本地部署超詳細)

非docker 1、下載Redis 歷史版本&#xff1a; http://download.redis.io/releases 我的&#xff1a; http://download.redis.io/releases/redis-7.0.5.tar.gz 2.安裝教程 1.Redis是基于c語言編寫的需要安裝依賴&#xff0c;需要安裝gcc yum install gcc-c 2.查看gcc版…

Spring——幾個常用注解

環境配置 1.在配置文件中導入約束(context — 共三個)并添加一項配置( context:annotation-config/) 才能支持注解的使用 context 約束&#xff1a; xmlns:context“http://www.springframework.org/schema/context” 2.xsi:schemaLocation下的&#xff1a;" http://ww…

Oopsie【hack the box】

Oopsie 解題流程 文件上傳 首先開啟機器后&#xff0c;我們先使用 nmap -sC -SV來掃描一下IP地址&#xff1a; -sC&#xff1a;使用 Nmap 的默認腳本掃描&#xff08;通常是 NSE 腳本&#xff0c;Nmap Scripting Engine&#xff09;。這個選項會自動執行一系列常見的腳本&am…

單片機-定時器中斷

1、相關知識 振蕩周期1/12us; //振蕩周期又稱 S周期或時鐘周期&#xff08;晶振周期或外加振蕩周期&#xff09;。 狀態周期1/6us; 機器周期1us; 指令周期1~4us; ①51單片機有兩組定時器/計數器&#xff0c;因為既可以定時&#xff0c;又可以計數&#xff0c;故稱之為定時器…

【藍牙】win11 筆記本電腦連接 hc-06

文章目錄 前言步驟 前言 使用電腦通過藍牙添加串口 步驟 設置 -> 藍牙和其他設備 點擊 顯示更多設備 更多藍牙設置 COM 端口 -> 添加 有可能出現卡頓&#xff0c;等待一會 傳出 -> 瀏覽 點擊添加 hc-06&#xff0c;如果沒有則點擊 再次搜索 確定 添加成…

Android切換語言不退出App

1.需求 實現用戶選擇語言&#xff08;未點擊下一步&#xff09;&#xff0c;更新當前界面UI&#xff0c;點擊下一步后&#xff0c;更新App的語言&#xff0c;并進行保存。 實現目標&#xff1a; 1.設置App的語言&#xff0c;本地進行保存 2.updateResources更新本地語言配置…