區間動態規劃——最長回文子序列長度(C++)

把夜熬成粥,然后喝了它。

——2024年7月1日


書接上回:區間動態規劃——最長回文子串(C++)-CSDN博客,大家有想到解決辦法嗎?

題目描述

????????給定一個字符串s(s僅由數字和英文大小寫字母組成,長度為1~1000),求s中最長的回文子序列長度。例如,s = “aferegga”,最長的回文子序列為“aerea”,其長度為5。


題解思路

? ? ? ? 區間動態規劃

下面是個人的思路:

1. 定義dp數組

????????定義 dp[i][j]表示 s[i...j] 中最長回文子序列長度。

2. 確定dp限制條件

注:len表示字符串長度

? ? ? ? ①對于任何 len == 1 的字符串,dp[i][j] = 1;

? ? ? ? ②對于任何 len == 2 的字符串,dp[i][j] = dp[i][j-1] + (s[i] == s[j]);

? ? ? ? ③對于任何 len ?≥ ?3 的字符串,有兩種情況:

????????如果 s[i] == s[j],那么dp[i][j] = dp[i+1][j-1] + 2

? ? ? ? 如果?s[i] != s[j],那么dp[i][j] = max(dp[i+1][j],dp[i][j-1])

解釋如下:

? ? ? ? 第一種情況,如果字符串長度為1的話,那么它一定是回文子串,長度唯一;

? ? ? ? 第二種情況,如果字符串長度為2,那它就有兩種可能,要么這兩個字符相等,要么不等,不管哪一種情況,這個字符串的回文子序列至少是大于等于1的(第一種情況),如果相等,無非是把這個相等的加上即可。

? ? ? ? 第三種情況,字符串長度不小于3時,也有兩種可能:
????????如果?s[i] == s[j],那么當前最長回文子序列長度就等于上一次的回文子序列長度加上2(兩個相同的字符),也可以表示為dp[i][j] = dp[i+1][j-1] + 2*(s[i] == s[j])
????????如果?s[i] != s[j],那么當前最長回文子序列長度至少是在 s[i+1....j]和s[i....j-1]中取最大值,即dp[i][j] = max(dp[i+1][j],dp[i][j-1])


推導過程

用矩陣推導如下:

?

代碼展示

// 最長回文子序列長度
int getLongestPalind(string s){int size = s.size();vector<vector<int>> dp(size, vector<int> (size, 0));// 定義dp數組// dp[i][j]表示從i到j的最長子回文字符串長度for(int len = 1; len <= size; len++){for(int i = 0; i + len - 1 < size; i++){int j = i + len - 1;if(len == 1){dp[i][j] = 1;}else if(len == 2){dp[i][j] = dp[i][j-1] + (s[i] == s[j]);}else{if(s[i] == s[j]){dp[i][j] = dp[i+1][j-1] + 2 * (s[i] == s[j]);}else{dp[i][j] = max(dp[i+1][j], dp[i][j-1]);}}}}return dp[0][size-1];
}

運行結果

完整代碼

// 區間動態規劃
#include<iostream>
#include<vector>
#include<string>using namespace std;// 最長回文子序列長度
int getLongestPalind(string s){int size = s.size();vector<vector<int>> dp(size, vector<int> (size, 0));// 定義dp數組// dp[i][j]表示從i到j的最長子回文字符串長度for(int len = 1; len <= size; len++){for(int i = 0; i + len - 1 < size; i++){int j = i + len - 1;if(len == 1){dp[i][j] = 1;}else if(len == 2){dp[i][j] = dp[i][j-1] + (s[i] == s[j]);}else{if(s[i] == s[j]){dp[i][j] = dp[i+1][j-1] + 2 * (s[i] == s[j]);}else{dp[i][j] = max(dp[i+1][j], dp[i][j-1]);}}}}return dp[0][size-1];
}int main(){string s;cout<<"請輸入字符串s:";cin>>s;cout<<"最長回文子序列長度為"<<getLongestPalind(s)<<endl;return 0;
}

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

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

相關文章

微積分-導數3(微分法則)

常見函數的導數 常量函數的導數 d d x ( c ) 0 \frac{d}{dx}(c) 0 dxd?(c)0 常量函數的圖像是一條水平線 y c y c yc&#xff0c;它的斜率為0&#xff0c;所以我們必須有 f ′ ( x ) 0 f(x) 0 f′(x)0。從導數的定義來看&#xff0c;證明也很簡單&#xff1a; f ′ …

在node.js環境中使用web服務器http-server運行html靜態文件

http-server http-server是一個超輕量級web服務器&#xff0c;它可以將任何一個文件夾當作服務器的目錄供自己使用。 當我們想要在服務器運行一些代碼&#xff0c;但是又不會配置服務器的時候&#xff0c;就可以使用http-server就可以搞定了。 使用方法 因為http-server需要…

Linux Vim 進階教程

Linux Vim 進階教程 1. 簡介 Vim&#xff08;Vi IMproved&#xff09;是一款功能強大的文本編輯器&#xff0c;廣泛應用于Linux和Unix系統中。本教程將深入探討Vim的高級功能和技巧&#xff0c;幫助您提升編輯效率和使用體驗。 2. Vim 配置和插件管理 2.1 配置文件 .vimrc …

QT拖放事件之三:自定義拖放操作-利用QDrag來拖動完成數據的傳輸

1、運行效果 1)Qt::MoveAction 2)Qt::CopyAction 2、源碼 #include "Widget.h" #include "ui_Widget.h" #include "common.h"

二級建造師(建筑工程專業)考試題庫,高效備考!!!

16.在施工合同履行期間發生的變更事項中&#xff0c;屬于工程變更的是&#xff08;&#xff09;。 A.質量要求變更 B.分包單位變更 C.合同價款變更 D.相關法規變更 答案&#xff1a;A 解析&#xff1a;工程變更一般是指在工程施工過程中&#xff0c;根據合同約定對施工的…

練習 String翻轉 注冊處理 字符串統計

p493 將字符串中指定部分進行翻轉 package chapter;public class reverse {public static void main(String[] args) {String str "abcdef";str reverseMethod(str,0,3);System.out.println(str);}public static String reverseMethod(String str, int start, in…

恭賀甘露海首屆道教南宗養生論壇暨天臺山第十屆道醫大會圓滿成功

6月13日&#xff0c;首屆中國道教南宗養生論壇暨天臺山第十屆道醫學術交流大會在浙江新昌重陽宮千人會場隆重開幕。 本次大會主辦單位&#xff1a;天臺山桐柏宮 中國民間中醫醫藥研究開發協會道醫學分會&#xff0c; 承辦單位&#xff1a;新昌縣重陽宮 &#xff0c;協辦單位&…

網絡基礎:靜態路由

靜態路由是一種由網絡管理員手動配置的路由方式&#xff0c;用于在網絡設備&#xff08;如路由器或交換機&#xff09;之間傳遞數據包。與動態路由不同&#xff0c;靜態路由不會根據網絡狀態的變化自動調整。 不同廠商的網絡設備在靜態路由的配置上有些許差異&#xff1b;下面…

什么是以太坊合約ABI(Application Binary Interface)

文章目錄 什么是以太坊合約ABI一、背景二、ABI&#xff08;Application Binary Interface&#xff09;三、怎么生成ABIsolc命令 四、abi內容FunctionEvent函數選擇器 五、參考 什么是以太坊合約ABI 一、背景 以太坊的智能合約程序&#xff0c;是在以太坊虛擬機&#xff08;Et…

網絡構建關鍵技術_2.IPv4與IPv6融合組網技術

互聯網數字分配機構&#xff08;IANA&#xff09;在2016年已向國際互聯網工程任務組&#xff08;IETF&#xff09;提出建議&#xff0c;要求新制定的國際互聯網標準只支持IPv6&#xff0c;不再兼容IPv4。目前&#xff0c;IPv6已經成為唯一公認的下一代互聯網商用解決方案&#…

安卓開發app-基礎的java項目構建補充知識

安卓開發app-基礎的java項目構建補充知識&#xff01;上一次分享了基礎的項目構建&#xff0c;但是還遺漏了一些基礎的內容。今天補充完整。 首先&#xff0c;是關于項目的一些配置文件的信息。 第一個配置文件&#xff1a;{setting.gradle} 國內阿里云倉庫地址信息&#xff1…

定制型汽車傳感器在汽車中的應用

定制型汽車霍爾傳感器在汽車中的應用及功能 曲軸和凸輪軸位置傳感器&#xff1a; 這些傳感器用于監測發動機的曲軸和凸輪軸的位置&#xff0c;幫助發動機管理系統精確控制點火時機和燃油噴射&#xff0c;提高發動機效率。 變速器控制系統&#xff1a; 在自動變速器中&#xf…

Linux虛擬串口設置

VSPD虛擬串口軟件安裝及使用 一、軟件安裝 1、Configure Virtual Serial Port Driver(VSPD) 1.1 首先下載 Configure Virtual Serial Port Driver(VSPD) 軟件 鏈接&#xff1a;https://pan.baidu.com/s/11aGc2aHGUew5QZ0XhaWXJw 提取碼&#xff1a;rmd7 1.2 安裝時注意將…

第20集《大乘起信論》

請大家打開《講義》第三十九頁。我們這一科是講未二、更約因緣互相成辦。 這地方是說&#xff0c;既然我們內心的本覺是沒有差別的&#xff0c;本覺在內心當中&#xff0c;白天、晚上不斷的熏習我們&#xff0c;但是為什么每一個人的成佛之道&#xff0c;會有這么多差別的因緣…

局域網必備文件傳輸神器,吾愛再出精品,支持電腦、手機無縫對接!

今天給大家帶來的不是一般的干貨&#xff0c;而是一款讓阿星我愛不釋手的局域網文件傳輸神器&#xff0c;而且是吾愛大佬出品。無論是工作還是生活&#xff0c;它都能給你帶來極大的便利。這年頭&#xff0c;誰還沒個跨設備傳輸文件的需求呢&#xff1f; 手機、電腦、平板&…

江大白 | 何凱明入職 MIT,首次帶隊提出Diffusion Loss,擴散模型思想提升生成速度和效果 !

本文來源公眾號“江大白”&#xff0c;僅用于學術分享&#xff0c;侵權刪&#xff0c;干貨滿滿。 原文鏈接&#xff1a;何凱明入職 MIT&#xff0c;首次帶隊提出Diffusion Loss&#xff0c;擴散模型思想提升生成速度和效果 &#xff01; 導讀 在圖像生成領域中&#xff0c;作…

使用 PyQt5 創建一個數字時鐘

使用 PyQt5 創建一個數字時鐘 效果代碼解析定義時鐘類初始化界面顯示時間 完整代碼 在這篇博客中&#xff0c;我們將使用 PyQt5 創建一個簡單的數字時鐘。 效果 代碼解析 定義時鐘類 class ClockWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTit…

對數函數轉換公式

對數函數換底公式. 1. 2. 3. 以上公式可以由以下公式推導而來, 1. 2. 3. 4.

zabbix監控進階:如何分時段設置不同告警閾值(多閾值告警)

作者 樂維社區&#xff08;forum.lwops.cn&#xff09;樂樂 在生產環境中&#xff0c;企業的業務系統狀態并不是一成不變的。在業務高峰時段&#xff0c;如節假日、促銷活動或特定時間段&#xff0c;系統負載和用戶訪問量會大幅增加&#xff0c;此時可能需要設置更高的告警閾值…

頂頂通呼叫中心中間件-私有化TTS安裝指南

頂頂通呼叫中心中間件-私有化TTS安裝指南 1、下載模型 執行這個下載模型 wget http://down.ddrj.com/paddlespeech_tts.zip 2、解壓模型 執行這個解壓模型 unzip -d /ddt/asrproxy paddlespeech_tts.zip 3、配置asrproxy.json文件 這里需要注意的是&#xff1a;以下內容…