線性DP:最長上升子序列(子序列可不連續,子數組必須連續)

?

目錄

?

Q1:簡單遍歷

Q2:變式(加大數據量)


Q1:簡單遍歷

Dp問題

狀態表示

f(i,j)

集合所有以第i個數結尾的上升子序列集合
-
f(i,j)的值存的是什么序列長度最大值max
-

狀態計算

(其實質是集合的劃分)

劃分

f[ i ] = max(f[ i ] , f [ j ]+1), j < i ,a[ j ]<a[ i ]


以上面的條件作為選或不選聚類形成劃分依據

#include<iostream>
#include<algorithm>
using namespace std;const int N=1010;int n;
int a[N], f[N];int main()
{cin>>n;for (int i = 1; i <= n; i++) cin>>a[i];for (int i = 1; i <= n; i++){f[i] = 1;  //初始化,只有a[i]一個數for (int j = 1; j < i; j++)//j<i,a[j] < a[i],max三個條件作為集合劃分為選或不選的依據if (a[j] < a[i])f[i] = max(f[i], f[j] + 1);}int res = 0;for (int i = 1; i <= n; i++) res = max(res, f[i]);//在dp數組內找maxcout<<res;return 0;
}


Q2:變式(加大數據量)

最終的邏輯上的候選最長子序列中越靠前的數字越小越好

?比如說3 8和1 8,1 8組合更好, 因為1和8之間的差距大,可以插入作為序列長度的數字多,所以在dp數組中可以不記錄3 8這個序列,把這一部分冗余去除。

那么換成與上述狀態表示的集合“所有以第i個數結尾的上升子序列集合”的邏輯來講,相同長度最后結尾的數字越小越好。

需要存儲:所有長度對應的最小結尾值,定義一個q[N]數組

?

上圖自變量是長度,應變量是該序列對應最小結尾值

可以證明是該數組是單調遞增的,因為假設長度為5的序列最小結尾值為10,長度為6的序列最小結尾值為8,那我是不是其實可以把長度為5的序列的10去掉換為8,把長度為6的序列的8去掉換為10啊?所以這種情況如果說代碼邏輯存的對的話是不應該發生的,故嚴格遞增。

核心過程:在q數組中找小于a[i]最大的一個數,我們在邏輯上是為了將a[i]插入到該邏輯子序列(候選的最長上升子序列,是我們的目標但是我們不存它的全部,只在q對應長度下標位置存它的最后一位數)的結尾,而q數組正好是存儲的該子序列結尾元素,所以最后實際的操作就是“覆蓋”掉q數組該位置的元素, 以實現邏輯上的邏輯子序列的后插操作。同樣也不用擔心“重復覆蓋”問題,比如q[1]是否被覆蓋兩次以上從而造成邏輯子序列邏輯長度與q下標不對應的情況,因為我們在小于a[i]、最大這里對我們找的q下標位置做了確切的定位,只要在q中存在元素比q[1]大的元素q[j]或者邊界位置空白,那么a[i]就會跳過q[1]被放在q[j]位置或者右邊界處。

#include<iostream>
#include<algorithm>
using namespace std;const int N=100010;
int a[N],q[N];//a存輸入進來的數,q每個數組元素位置i的意義為序列長度為i的序列結尾的最小值
int n;int main()
{cin>>n;for(int i=0;i<n;i++)cin>>a[i];int len=0;//q中的元素個數q[0]=-2e9;//哨兵for (int i = 0; i < n; i++){int l=0,r=len;while (l < r)//二分過程,在q中找小于a[i]的最大的一個數{int mid = l + r + 1 >> 1;//+1是為了邊界 if (q[mid] < a[i]) l = mid;else r = mid - 1;}len = max(len, r + 1);q[r + 1] = a[i];//不用擔心覆蓋問題,找到了就該覆蓋,在邏輯上是個后插操作//邏輯上在招的對應上升子序列后插,存儲上是結尾數字,那就是要賦值給q[r + 1]}cout<<len;return 0;
}

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

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

相關文章

【Web前端技術】第二節—HTML標簽(上)

hello&#xff01;好久不見—— 做出一個屬于自己的網站&#xff01; 云邊有個稻草人-個人主頁 Web前端技術—本篇文章所屬專欄 目錄 一、HTML 語法規范 1.1 基本語法概述 1.2 標簽關系 二、HTML 基本結構標簽 2.1 第一個 HTML 網頁 2.2 基本結構標簽總結 三、網頁開發…

論文降重GPT指令-實側有效從98%降低到8%

步驟1&#xff1a;文本接收 指令&#xff1a; 請用戶提供需要優化的文本內容。 對文本進行初步分析&#xff0c;識別文本的基本結構和風格。 操作&#xff1a; 接收并分析用戶提交的文本。 步驟2&#xff1a;文本優化 2.1 連接詞處理 指令&#xff1a; 刪除或替換連接詞&#x…

Jsp技術入門指南【九】詳細講解JSTL

Jsp技術入門指南【九】詳細講解JSTL 前言一、什么是JSTL&#xff1f;&#xff08;JavaServer Pages Standard Tag Library&#xff09;二、使用JSTL前的準備三、核心標簽庫常用標簽詳解1. <c:out>&#xff1a;輸出內容&#xff08;替代<% %>&#xff09;2. <c:i…

Linux操作系統--進程的創建和終止

目錄 1.進程創建 1.1fork()函數初識 1.2寫時拷貝 1. 提升系統效率 2. 隔離錯誤影響 3. 支持并行計算 2.進程終止&#xff1a; 2.1進程退出場景&#xff1a; 2.2進程常見退出方法&#xff1a; 2.3_exit()系統調用接口 2.4exit函數 2.5return退出 1.進程創建 1.1for…

OSPF綜合實驗——企業邊界路由器、LSA收斂

IP劃分粗略記號&#xff0c;方便后續配置 配置IP和環回--->ISP的IP配置和cheat認證---->配置OSPF和RIP---->企業邊界路由網段匯總---->特殊區域---> 缺省路由&#xff0c;重分發---->nat配置---->實現全網通 路由器配置IP和環回地址 <Huawei>sys…

Java【網絡原理】(4)HTTP協議

目錄 1.前言 2.正文 2.1自定義協議 2.2HTTP協議 2.2.1抓包工具 2.2.2請求響應格式 2.2.2.1URL 2.2.2.2urlencode 2.2.3認識方法 2.2.3.1GET與POST 2.2.3.2PUT與DELETE 2.2.4請求頭關鍵屬性 3.小結 1.前言 哈嘍大家好啊&#xff0c;今天來繼續給大家帶來Java中網絡…

Android學習總結之APK打包流程

一、預處理階段&#xff08;編譯前準備&#xff09; 1. AIDL 文件處理&#xff08;進程間通信基礎&#xff09; 流程&#xff1a; 用于實現 Android 系統中不同進程間的通信&#xff08;IPC&#xff09;。在項目構建時&#xff0c;AIDL 編譯器會將 .aidl 文件編譯為 Java 接口…

BDO分廠積極開展“五個一”安全活動

BDO分廠為規范化學習“五個一”活動主題&#xff0c;按照“上下聯動、分頭準備 、差異管理、資源共享”的原則&#xff0c;全面激活班組安全活動管理新模式&#xff0c;正在積極開展班組安全活動&#xff0c;以單元班組形式對每個班組每周組織一次“五個一”安全活動。 丁二醇單…

【音視頻】FLV格式分析

FLV概述 FLV(Flash Video)是Adobe公司推出的?種流媒體格式&#xff0c;由于其封裝后的?視頻?件體積?、封裝簡單等特點&#xff0c;?常適合于互聯?上使?。?前主流的視頻?站基本都?持FLV。采?FLV格式封裝的?件后綴為.flv。 FLV封裝格式是由?個?件頭(file header)和…

Java表達式1.0

Java開發工具 在當今的Java開發領域&#xff0c;IntelliJ IDEA已然成為了眾多開發者心目中的首選利器&#xff0c;它被廣泛認為是目前Java開發效率最快的IDE工具。這款備受矚目的開發工具是由JetBrains公司精心打造的&#xff0c;而JetBrains公司總部位于風景如畫的捷克共和國首…

Map遍歷

第一種遍歷方式鍵找值&#xff1a; 增強for循環&#xff1a; 通過獲取元素中的鍵&#xff0c;get到對應的值&#xff0c;通過增強for循環獲取集合里的鍵&#xff0c;然后用get方法通過鍵獲取值 代碼演示&#xff1a; import java.text.ParseException; import java.util.*;…

內網穿透服務器—FRP

某天某刻空閑的時候跟同事聊的本地的存儲服務如果我想讓其他公網內的用戶使用&#xff08;這個存儲服務只是一個臨時文件傳遞站&#xff0c;碎文件&#xff0c;安全低的&#xff09;&#xff0c;然后我們就探討到了FRP一個比較久遠的技術&#xff0c;來做內網穿透&#xff0c;下…

力扣每日打卡16 781. 森林中的兔子(中等)

力扣 781. 森林中的兔子 中等 前言一、題目內容二、解題方法1. 哈希函數&#xff08;來自評論區大佬的解題方法&#xff09;2.官方題解2.1 方法一&#xff1a;貪心 前言 這是刷算法題的第十六天&#xff0c;用到的語言是JS 題目&#xff1a;力扣 781. 森林中的兔子 (中等) 一、…

基于深度學習的線性預測:創新應用與挑戰

一、引言 1.1 研究背景 深度學習作為人工智能領域的重要分支&#xff0c;近年來在各個領域都取得了顯著的進展。在線性預測領域&#xff0c;深度學習也逐漸興起并展現出強大的潛力。傳統的線性預測方法在處理復雜數據和動態變化的情況時往往存在一定的局限性。而深度學習憑借…

黑馬點評redis改 part 3

優惠券秒殺 全局唯一id 每個店鋪都可以發布優惠券&#xff1a; 當用戶搶購時&#xff0c;就會生成訂單并保存到tb_voucher_order這張表中&#xff0c;而訂單表如果使用數據庫自增ID就存在一些問題&#xff1a;實際開發中數據庫ID一般不會參與業務邏輯 增加一個訂單號字段就好…

低代碼開發平臺:企業數字化轉型的加速器

一、引言 在數字化時代&#xff0c;企業的轉型需求日益迫切。為了在激烈的市場競爭中保持領先地位&#xff0c;企業需要快速響應市場變化、優化業務流程、提升運營效率。然而&#xff0c;傳統的軟件開發模式往往面臨開發周期長、成本高、靈活性差等問題&#xff0c;難以滿足企業…

個人所得稅

文章目錄 一、名詞解釋二、個人所得稅計算方法 (舉例)1.累計預扣預繳應納稅所得額、本期應預扣預繳稅額2.個人所得稅預扣率表一3.個人所得稅計算舉例 三、專項附加扣除政策介紹四、年度匯算清繳政策介紹五、常見問答 一、名詞解釋 累計預扣法是指扣繳義務人在一個納稅年度內預…

二進制和docker兩種方式部署Apache pulsar(standalone)

#作者&#xff1a;閆乾苓 文章目錄 1、二進制安裝部署Pulsar(standalone)1.1 安裝配置JDK1.2 下載解壓pulsar安裝包1.3 啟動獨立模式的Pulsar 集群1.4 創建主題測試1.5 向主題寫入消息測試1.6 從主題中讀取消息測試 2.docker安裝部署Pulsar(standalone)2.1 使用docker 啟動Pul…

如何在 Go 中創建和部署 AWS Lambda 函數

AWS Lambda 是一個無服務器計算平臺&#xff0c;您可以使用自己喜歡的編程語言編寫代碼&#xff0c;無需擔心設置虛擬機。 您只需為 Lambda 函數的調用次數和運行時間&#xff08;毫秒&#xff09;付費。 我們大多數人都了解 JavaScript 和 Python&#xff0c;但它們的內存效率…

STM32配置系統時鐘

1、STM32配置系統時鐘的步驟 1、系統時鐘配置步驟 先配置系統時鐘&#xff0c;后面的總線才能使用時鐘頻率 2、外設時鐘使能和失能 STM32為了低功耗&#xff0c;一開始是關閉了所有的外設的時鐘&#xff0c;所以外設想要工作&#xff0c;首先就要打開時鐘&#xff0c;所以后面…