淺說線性DP(下)

聲明

最近博主身體不適,更新較慢,請大家體諒體諒

最大上升子序列

【題目描述】
一個數的序列
你的任務,就是對于給定的序列,求出最大上升子序列和。注意,最長的上升子序列的和不一定是最大的,比如序列(100,1,2,3)的最大上升子序列和為100,而最長上升子序列為(1,2,3)。

【輸入】
輸入的第一行是序列的長度N(1≤N≤1000)。第二行給出序列中的N個整數,這些整數的取值范圍都在0到10000(可能重復)。

【輸出】
最大上升子序列和。

如果前面的最長上升子序列那道題理解清楚了,那么該題做起來就會發現本質上和前一道題是一樣的。該題的決策對象和階段都和前一道題一樣,只是狀態變為dp[i]表示以第i個數作為結尾的最大上升子序列的長度。
決策:這里要求子序列之和最大,對于每一個位置的數,只能從前面的比當前值小的數轉移過來,要求序列之和最大,那么這個序列前面選擇的數之和要最大,那么我們需要從前面可以選擇的點中序列和最大的點轉移過來。

我們設dp[i]表示以i結尾的最大子序列之和,那么我們就可以很輕松的得到一下內容
d p [ i ] = m a x ( d p [ i ] , d p [ j ] + a [ i ] ) j ∈ [ 1 , i ? 1 ] dp[i]=max(dp[i],dp[j]+a[i]) j\in[1,i-1] dp[i]=max(dp[i],dp[j]+a[i])j[1,i?1]
所以就有以下ACcode

#include<bits/stdc++.h>
using namespace std;int a[10010],dp[10010],ans=INT_MIN;
int main(){int n;cin>>n;for (int i=1;i<=n;i++){cin>>a[i];dp[i]=a[i];}	for (int i=1;i<=n;i++){for (int j=1;j<i;j++){if (a[j]<a[i]){dp[i]=max(dp[i],dp[j]+a[i]);}}ans=max(ans,dp[i]);}cout<<ans;return 0;
}

合唱隊形

我們先來看一道例題

[NOIP2004 提高組] 合唱隊形

題目描述

n n n 位同學站成一排,音樂老師要請其中的 n ? k n-k n?k 位同學出列,使得剩下的 k k k 位同學排成合唱隊形。

合唱隊形是指這樣的一種隊形:設 k k k 位同學從左到右依次編號為 1 , 2 , 1,2, 1,2, , k ,k ,k,他們的身高分別為 t 1 , t 2 , t_1,t_2, t1?,t2?, , t k ,t_k ,tk?,則他們的身高滿足 t 1 < ? < t i > t i + 1 > t_1< \cdots <t_i>t_{i+1}> t1?<?<ti?>ti+1?> > t k ( 1 ≤ i ≤ k ) >t_k(1\le i\le k) >tk?(1ik)

你的任務是,已知所有 n n n 位同學的身高,計算最少需要幾位同學出列,可以使得剩下的同學排成合唱隊形。

輸入格式

共二行。

第一行是一個整數 n n n 2 ≤ n ≤ 100 2\le n\le100 2n100),表示同學的總數。

第二行有 n n n 個整數,用空格分隔,第 i i i 個整數 t i t_i ti? 130 ≤ t i ≤ 230 130\le t_i\le230 130ti?230)是第 i i i 位同學的身高(厘米)。

輸出格式

一個整數,最少需要幾位同學出列。

樣例 #1

樣例輸入 #1

8
186 186 150 200 160 130 197 220

樣例輸出 #1

4

提示

對于 50 % 50\% 50% 的數據,保證有 n ≤ 20 n \le 20 n20

對于全部的數據,保證有 n ≤ 100 n \le 100 n100

該題實際上就是前面求一個最長上升子序列,對后面求一個最長下降子序列。但是問題在于這兩個序列的連接點我們不知道,沒有辦法直接求解出來,也就是說任意一個點都有可能作為這個連接點,所以我們需要先枚舉這個連接點x,再分別對區間[1,x]求最長上升子序列,對區間[x+1,n]求最長下降子序列。這種做法的時間復雜度為O(n3),但是該題的數據范圍改為n<=2000,所以還需要優化。

我們先看前面的最長上升子序列,在枚舉的連接點i逐漸增大的時候,如果我們已經存儲了前i-1個數的最長上升子序列的答案,那么前i個數的最長上升子序列的答案就只有兩種情況,第一種就是前面i-1的答案,第二種就是以第i個點作為結尾的答案,沒有必要再去前面重新計算一次,每一次的時間復雜度為O(n)。對于后面的下降序列,在i增大時,范圍在逐漸縮小,我們只需要把它看做是增大就可以,這種做法在之前做過的一些題中使用過,我們只需要倒著枚舉連接點i即可,這樣,i在逐漸變小,后面的區間在增大,做法和前面一樣。

#include<bits/stdc++.h>
using namespace std;int n,dp1[5000],dp2[5000];//dp1為從前往后的最長上升子序列,dp2為從后往前 
int a[5000],minn=INT_MAX;
int main(){cin>>n;for (int i=1;i<=n;i++){cin>>a[i];dp1[i]=1;dp2[i]=1;}for (int i=1;i<=n;i++){for (int j=1;j<i;j++){if (a[j]<a[i]){dp1[i]=max(dp1[i],dp1[j]+1);}}}for (int i=n;i>=1;i--){for (int j=n;j>i;j--){if (a[i]>a[j]){dp2[i]=max(dp2[i],dp2[j]+1);}}}for (int i=n;i>=1;i--){minn=min(n-dp1[i]-dp2[i],minn);}cout<<minn+1;return 0;
}

最長公共子序列

我們要得到兩個字符串的最長公共子序列,暴力做法是先枚舉一個字符串的開頭,再去枚舉另一個字符串的開頭,然后找出最大公共子列,時間復雜度為O(n^3)。我們考慮如何優化,前面依然是枚舉兩個字符串的開頭,主要考慮求最大公共子序列時是否可以通過前面算出的答案直接得到正確答案。考慮開頭無法知道匹配的最長公共子序列到底匹配到了哪一個位置,所以我們記錄下以當前位置結尾的最長公共序列的長度。因為有兩個字符串,所以dp[i]無法分別記錄兩個字符串的結尾位置,所以需要用dp[i][j]。

狀態:我們設dp[i][j]表示前綴長度為i的a子串和一個長度為j的b序列的最長公共子序列的長度。決策對象:每個位置的字符。階段:a串的每個位置和b串的每個位置都可以組合,一共有n*m個階段。決策:如果a[i]==b[j],那么(i,j)相對于(i1,j-1)會多匹配一個,即dp[i][j]=dp[i-1][j-1]。如果a[i]!=b[j],答案就是dp[i-1][j-1]嗎?其實并不是,因為a[i]可以和b[j-1]匹配,或者b[j]可以和a[i-1]匹配,這種情況下,dp[i-1][j-1]的答案是錯誤的。

當a[i]!=b[j]時,正確答案是dp[i][j]=max (dp[i-1][j],dp[i][j-1]),那么萬一是a[i]和b[j1]、a[i-1]和b[j]都無法匹配的情況,是否還需要和dp[i-1][j-1]比較呢?不需要,因為在這種情況下,計算dp[i][j-1]時,a[i]!=b[j-1],那么dp[i][j-1]=max(dp[i-1][j-1], dp[i][j-2]),這個答案中已經報了dp[i-1][j-1]的情況,所以不需要再和dp[i-1][j-1]比較。還需要設置初始值,當a串和b串都沒有字符時,最長公共串長度為1,即dp[0][0]=0。

#include<bits/stdc++.h>
using namespace std;int dp[1010][1010];
int main(){string a,b;cin>>a>>b;dp[0][0]=0;for (int i=1;i<=a.length();i++){for (int j=1;j<=b.length();j++){if (a[i-1]==b[j-1]) dp[i][j]=dp[i-1][j-1]+1;else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);}}cout<<dp[a.length()][b.length()];return 0;
}

最長公共子串

該題和上一題的狀態、對象、階段都是相同的,不同的是狀態的轉移。dp[i][j]表示以位置i結尾的a串和以位置j結尾的b串的最長公共子串. 如果a[i]!=b[j],那么這個子串一定是不可以匹配的,因為這里說了分別以i,j結尾,所以dp[i][j]=0。如果a[i]=b[j],長度就在之前的dp[i-1][j-1]的基礎上增加1,即dp[i][j]=dp[i-1][j-1]+1。

#include<bits/stdc++.h>
using namespace std;int dp[1500][1510];
int maxn=INT_MIN;
int main(){string a,b;cin>>a>>b;dp[0][0]=0;for (int i=1;i<=a.length();i++){for (int j=1;j<=b.length();j++){if (a[i-1]==b[j-1]){dp[i][j]=dp[i-1][j-1]+1;}maxn=max(dp[i][j],maxn);}}cout<<maxn;return 0;
}

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

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

相關文章

03-3.3.1 棧在括號匹配中的應用

&#x1f44b; Hi, I’m Beast Cheng&#x1f440; I’m interested in photography, hiking, landscape…&#x1f331; I’m currently learning python, javascript, kotlin…&#x1f4eb; How to reach me --> 458290771qq.com 喜歡《數據結構》部分筆記的小伙伴可以訂…

echarts的使用

一 echarts的使用 引入 echarts.js 文件 <script src"https://cdn.jsdelivr.net/npm/echarts/dist/echarts.min.js"></script> 準備一個呈現圖表的盒子 <div class"container"><div class"t_header"><span>端午…

東方博宜1760 - 整理抽屜

題目描述 期末考試即將來臨&#xff0c;小T由于同時肩負了學習、競賽、班團活動等多方面的任務&#xff0c;一直沒有時間好好整理他的課桌抽屜&#xff0c;為了更好地復習&#xff0c;小T首先要把課桌抽屜里的書分類整理好。 小T的抽屜里堆著 N 本書&#xff0c;每本書的封面上…

智能視頻監控平臺LntonCVS視頻融合共享平臺保障露營安全解決方案

在當今社會&#xff0c;都市生活的快節奏和壓力使得越來越多的人渴望逃離城市的喧囂&#xff0c;尋求一種短暫的慢生活體驗。他們向往在壯麗的山河之間或寧靜的鄉村中露營&#xff0c;享受大自然的寧靜與美好。隨著露營活動的普及&#xff0c;露營地的場景也變得更加豐富多樣&a…

使用python繪制核密度估計圖

使用python繪制核密度估計圖 核密度估計圖介紹效果代碼 核密度估計圖介紹 核密度估計&#xff08;Kernel Density Estimation&#xff0c;KDE&#xff09;是一種用于估計數據概率密度函數的非參數方法。與直方圖不同&#xff0c;KDE 可以生成平滑的密度曲線&#xff0c;更好地…

Mybatis使用緩存的配置總結

1.全局變量配置cacheEnabled&#xff1a; ture&#xff08;默認&#xff09;&#xff1a;開啟二級緩存&#xff0c; false&#xff1a;關閉二級緩存&#xff0c;但一級緩存不受影響 2.映射文件中mapper標簽下&#xff1a; 配置有&#xff1a;開啟二級緩存 沒配置有&#x…

LeetCode62不同路徑

題目描述 一個機器人位于一個 m x n 網格的左上角 &#xff08;起始點在下圖中標記為 “Start” &#xff09;。機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角&#xff08;在下圖中標記為 “Finish” &#xff09;。問總共有多少條不同的路徑&#xff1f; …

大模型參加高考,同寫2024年高考作文,及格分(通義千問、Kimi、智譜清言、Gemini Advanced、Claude-3-Sonnet、GPT-4o)

大家好&#xff0c;我是章北海 今天高考&#xff0c;上午的語文結束&#xff0c;市面上又要來一場大模型參考的文章了。 我也湊湊熱鬧&#xff0c;讓通義千問、Kimi、智譜清言一起來寫一下高考作文。 公平起見&#xff0c;不加任何其他prompt&#xff0c;直接把題目甩過去。…

網絡基礎_02

1.ARP協議 地址解析協議&#xff08;Address Resolution Protocol&#xff09; 已知對方的三層ip地址&#xff0c;需要二層mac地址 當一臺設備&#xff08;請求方&#xff09;需要知道某個 IP 地址對應的 MAC 地址時&#xff0c;會使用 ARP封裝一個數據幀。這臺設備的網絡層以…

華為RH2288H V3服務器iBMC的SSL證書續期

本文對華為RH2288H V3服務器iBMC的SSL證書續期&#xff0c;以避名登錄告警提示及主機狀態異常。 一、檢查現網服務器iBMC的SSL證書到期時間 登錄iBMC&#xff0c;點擊配置--SSL證書&#xff0c;如下&#xff1a; 可以看到本服務器SSL證書將于今年7月22日到期。 二、聯系廠家…

【第四節】C/C++數據結構之樹與二叉樹

目錄 一、基本概念與術語 二、樹的ADT 三、二叉樹的定義和術語 四、平衡二叉樹 4.1 解釋 4.2 相關經典操作 4.3 代碼展示 一、基本概念與術語 樹(Tree)是由一個或多個結點組成的有限集合T。其中: 1 有一個特定的結點&#xff0c;稱為該樹的根(root)結點&#xff1b; 2 …

【Linux】進程2——管理概念,進程概念

1.什么是管理&#xff1f; 那在還沒有學習進程之前&#xff0c;就問大家&#xff0c;操作系統是怎么管理進行進程管理的呢&#xff1f; 很簡單&#xff0c;先把進程描述起來&#xff0c;再把進程組織起來&#xff01; 我們拿大學為例子 最典型的管理者——校長最典型的被管理…

來自工業界的知識庫 RAG 服務(三),FinGLM 競賽獲獎項目詳解

背景介紹 前面介紹過工業界的 RAG 服務 QAnything 和 RagFlow 的詳細設計&#xff0c;也介紹過來自學術界的 一些優化手段。 前一陣子剛好看到智譜組織的一個金融大模型比賽 FinGLM&#xff0c;主要做就是 RAG 服務的競賽&#xff0c;深入研究了其中的幾個獲獎作品&#xff…

Pyramid Vision Transformer, PVT(ICCV 2021)原理與代碼解讀

paper&#xff1a;Pyramid Vision Transformer: A Versatile Backbone for Dense Prediction without Convolutions official implementation&#xff1a;GitHub - whai362/PVT: Official implementation of PVT series 存在的問題 現有的 Vision Transformer (ViT) 主要設計…

C++結合ffmpeg獲取聲音的分貝值

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、分貝是什么&#xff1f;1.功率量2.場量 二、實際操作1.分析wav文件2.讀取麥克風 總結 前言 最近面對一個需求&#xff0c;就是需要傳遞聲音文件到模型里推…

鏈表的回文結構OJ

鏈表的回文結構_牛客題霸_牛客網對于一個鏈表&#xff0c;請設計一個時間復雜度為O(n),額外空間復雜度為O(1)的算法&#xff0c;判斷其是否為。題目來自【牛客題霸】https://www.nowcoder.com/practice/d281619e4b3e4a60a2cc66ea32855bfa?tpId49&&tqId29370&rp1&a…

CodeMeter助力Hilscher,推動實現全球智能制造連接解決方案

Hilscher的旗艦店為開放工業4.0聯盟&#xff08;OI4&#xff09;社區提供了應用商店的便捷和開放性&#xff0c;將這一概念引入工業領域。該商店依托CodeMeter的許可證管理和加密保護&#xff0c;為工業用戶提供了豐富的應用和解決方案庫&#xff0c;滿足他們在車間自動化和連接…

2020年06月C語言二級真題

計算矩陣邊緣元素之和 題目描述 輸入一個整數矩陣&#xff0c;計算位于矩陣邊緣的元素之和。 所謂矩陣邊緣的元素&#xff0c;就是第一行和最后一行的元素以及第一列和最后一列的元素。 輸入格式 第一行分別為矩陣的行數n和列數m&#xff0c;兩者之間以一個空格分開。 接下來輸…

WPF中讀取Excel文件的內容

演示效果 實現方案 1.首先導入需要的Dll(這部分可能需要你自己搜一下) Epplus.dll Excel.dll ICSharpCode.SharpZipLib.dll 2.在你的解決方案的的依賴項->添加引用->瀏覽->選擇1中的這幾個Dll點擊確定。(添加依賴) 3.然后看代碼內容 附上源碼 using Excel; usi…

計網復習資料

一、選擇題&#xff08;每題2分&#xff0c;共40分&#xff09; 1. Internet 網絡本質上屬于&#xff08; &#xff09;網絡。 A.電路交換 B.報文交換 C.分組交換 D.虛電路 2.在 OSI 參考模型中,自下而上第一個提供端到端服務的是( )。 A.數據鏈路層 B.傳輸…