[dp]最長單調遞增子序列LIS

https://www.51nod.com/tutorial/course.html#!courseId=12

解題關鍵:

如果將子序列按照長度由短到長排列,將他們的最大元素放在一起,形成新序列$B\left\{ {{b_1},{b_2}, \ldots ?\ldots ,{b_j}} \right\}$,則序列$B$滿足${b_1} < {b_2} < ?\ldots ?\ldots ?< {b_j}$。這個關系比較容易說明,假設${b_{xy}}$表示序列A中長度為$x$的遞增序列中的第$y$個元素,顯然,如果在序列$B$中存在元素${b_{mm}} > {b_{nn}}$,且$m < n$則說明子序列${B_n}$的最大元素小于${B_m}$的最大元素,因為序列是嚴格遞增的,所以在遞增序列${B_n}$中存在元素${b_{nm}} < {b_{nn}}$,且從${b_{n0}}$到${b_{nm}}$形成了一個新的長度為$m$的遞增序列,因為${b_{mm}} > {b_{nn}}$,所以${b_{mm}} > {b_{nm}}$,這就說明在序列$B$中還存在一個長度為$m$,最大元素為${b_{nm}} < {b_{mm}}$的遞增子序列,這與序列的定義,${b_{mm}}$是所有長度為m的遞增序列中第$m$個元素最小的序列不符,所以序列$B$中的各元素嚴格遞增。

?

注意liss存的是下標,主要是為了求pre用,若只求max,你當然可以設成值。?

爆炸了,剛發現《挑戰競賽程序設計》上有一個代碼非常非常簡短的模板,炸了;

STL模板:

 1 #include<iostream>  
 2 #include<cstdio>  
 3 #include<cstring>  
 4 #include<algorithm>  
 5 #include<functional> 
 6 using namespace std;  
 7   
 8 const int N=131072;  
 9 int n=7, a[N] = {0,0,1,1,0,0,2};  
10 template<class Cmp>
11 int LIS (Cmp cmp){  
12     static int m=0,end[N];
13     for(int i=0;i<n;i++){  
14         int pos=lower_bound(end,end+m,a[i],cmp)-end;  
15         end[pos]=a[i],m+=pos==m;  
16     }  
17     return m;
18 } 
19 bool greater1(int value){  
20     return value>=1; 
21 }  
22   
23 int main(){
24     cout<<LIS(less<int>())<<endl;         //嚴格上升  
25     cout<<LIS(less_equal<int>())<<endl;   //非嚴格上升  
26     cout<<LIS(greater<int>())<<endl;      //嚴格下降  
27     cout<<LIS(greater_equal<int>())<<endl;//非嚴格下降  
28     cout<<count_if(a,a+7,greater1)<<endl; //計數  
29     //第二個參數為末尾元素的下一個位置  
30     return 0;  
31 }  

?

最終模板:

 1 #include<bits/stdc++.h>
 2 #define INF 0x3f3f3f3f
 3 using namespace std;
 4 typedef long long ll;
 5 ll a[50002],dp[50002];
 6 int main(){
 7     int n;
 8     cin>>n;
 9     for(int i=0;i<n;i++){
10         cin>>a[i];
11     }
12     fill(dp,dp+n,INF);
13     for(ll i=0;i<n;i++){
14         *lower_bound(dp,dp+n,a[i])=a[i];
15     }
16     printf("%lld\n",lower_bound(dp,dp+n,INF)-dp);
17 } 

?

自己改進模板(不帶路徑):注意二分時上界為len+1就ok了,也可以fill成inf,更簡單明了

 1 #include<bits/stdc++.h>
 2 #define INF 0x3f3f3f3f
 3 using namespace std;
 4 typedef long long ll;
 5 int arr[50002],dp[50002];
 6 int n,len;
 7 int find1(int x){
 8     int mid,l=1,r=len+1;
 9     while(l<r){
10         mid=(l+r)>>1;
11         if(dp[mid]>x) r=mid;
12         else l=mid+1;
13     }
14     return r;
15 }
16 int lis(){
17     int dex;
18     for(int i=1;i<=n;i++){
19        dex=find1(arr[i]);
20         dp[dex]=arr[i];
21         len=max(len,dex);
22     }
23     return len;
24 }
25 int main(){
26     cin>>n;
27     for(int i=1;i<=n;i++){
28         cin>>arr[i];
29     }
30     ll ans=lis();
31     printf("%lld\n",ans);
32     return 0;
33 }

?

?

?

?帶路徑模板1

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cstdlib>
 5 #include<iostream>
 6 using namespace std;
 7 typedef long long ll;
 8 int a[50002],dp[50002],pre[50002],res[50002],n;
 9 int len;
10 
11 int find1(int x){
12     int mid,l=1,r=len+1;
13     while(l<r){
14         mid=(l+r)>>1;
15         if(a[dp[mid]]>x) r=mid;
16         else l=mid+1;
17     }
18     return r;
19 }
20 
21 int lis(){
22     len=0;
23     for(int i=1;i<=n;i++){
24         int dex=find1(a[i]);
25         dp[dex]=i;
26         if(dex!=1) pre[i]=dp[dex-1];
27         len=max(len,dex);
28     }
29     
30     int k=dp[len],t=len;
31     while(pre[k]!=k){
32         res[t--]=a[k];
33         k=pre[k];
34     }
35     res[t]=a[k];
36     return len;
37 }
38 int main(){
39     cin>>n;
40     for(int i=0;i<=n+2;i++)    pre[i]=i;
41     for(int i=1;i<=n;i++)    cin>>a[i];
42     
43     ll ans=lis();
44     printf("%lld\n",ans);
45     for(int i=1;i<=ans;i++){
46         printf("%d ",res[i]);
47     }
48     printf("\n");
49 }

?

?帶路徑模板2

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cstdlib>
 5 #include<iostream>
 6 using namespace std;
 7 typedef long long ll;
 8 int arr[50002],liss[50002],pre[50002],res[50002];
 9 int find1(int i,int l,int r){
10     int mid;
11     while(l<r){
12         mid=(l+r)>>1;
13         if(arr[liss[mid]]>arr[i]) r=mid;
14         else l=mid+1;
15     }
16     return r;
17 }
18 int lis(int len){
19     int max=1;
20     liss[0]=0;
21     for(int i=0;i<len;i++){
22         int index=find1(i,0, max-1);
23         if(index==0&&arr[liss[index]]>=arr[i]){
24             liss[index]=i;
25             continue;
26         }//增加這條語句主要是pre的影響,不需要路徑的話,完全可以去掉。
27         if(index==max-1&&arr[liss[index]]<arr[i]){
28             liss[max++]=i;
29             pre[i]=liss[index];
30             continue;
31         }
32         liss[index]=i;
33         pre[i]=liss[index-1];
34     }
35     
36     int k=liss[max-1],t=max-1;
37     while(pre[k]!=k){
38         res[t--]=arr[k];
39         k=pre[k];
40     }
41     res[t]=arr[k];
42     return max;
43 }
44 int main(){
45     int n;
46     cin>>n;
47     for(int i=0;i<n+2;i++){
48         pre[i]=i;
49     }
50     for(int i=0;i<n;i++){
51         cin>>arr[i];
52     }
53     ll ans=lis(n);
54     printf("%lld\n",ans);
55     for(int i=0;i<ans;i++){
56         printf("%d ",res[i]);
57     }
58     printf("\n");
59 }

?

轉載于:https://www.cnblogs.com/elpsycongroo/p/6847444.html

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

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

相關文章

jQuery中的元素操作

jQuery元素操作 通過jQuery可以操作控制元素的樣式,文本,屬性等 jquery樣式操作 css操作行內樣式 // 獲取div的樣式 $("div").css("width"); $("div").css("color");//設置div的樣式 $("div").css("width",&q…

指針結構體函數-事實上能夠這樣具體理解

今天一大早登了下QQ空間&#xff0c;看到本科的一個學弟發表一篇日志。寫關于西電微軟俱樂部面試題的解答&#xff0c;寫的非常不 錯。我也一下子起興了&#xff0c;由于我以前也是被指針困惑非常久。搞不清頭緒&#xff0c;本科到研究生。我也筆試面試不下二十次 了。每次面試…

【python畢業設計】Django框架實現學生信息管理系統

Django框架實現學生信息管理系統 演示視頻&#xff1a;Django學生信息管理系統_騰訊視頻 演示界面內容如下 總體概括 注冊流程 首先進行輸入用戶名&#xff08;郵箱&#xff09;、密碼以及驗證碼&#xff0c;輸入完之后點擊注冊按鈕。如果輸入的不正確&#xff0c;提示錯誤信…

python中continue只結束本次循環_循環(while,break,continue),轉義字符

Apple iPhone 11 (A2223) 128GB 黑色 移動聯通電信4G手機 雙卡雙待 4999元包郵 去購買 >01. 程序的三大流程 在程序開發中&#xff0c;一共有三種流程方式&#xff1a; 順序 —— 從上向下&#xff0c;順序執行代碼 分支 —— 根據條件判斷&#xff0c;決定執行代碼的 分支 …

碼率控制技術原理

引起編碼器的輸出比特碼率波動的原因主要有兩個。首先&#xff0c;數字視頻信號中包含了大量的時域和空域冗余&#xff0c;編碼器的主要任務就是去除這些冗余。由于時間冗余和空間冗余是隨機的&#xff0c;從而造成編碼器輸出比特率波動。另一個原因是變長編碼&#xff0c;變長…

python如何安裝pip

pip的安裝操作 pip簡介 pip 是一個現代的&#xff0c;通用的 Python 包管理工具。提供了對Python 包的查找、下載、安裝、卸載的功能。 環境搭建 安裝pip首先要安裝python,可以參考python安裝教程 安裝完python后,可以在cmd中輸入pip list 測試一下pip是否默認附帶著安裝,若…

【排序算法】python 十大經典排序算法(全網最詳)

排序算法可以分為內部排序和外部排序&#xff0c;內部排序是數據記錄在內存中進行排序&#xff0c;而外部排序是因排序的數據很大&#xff0c;一次不能容納全部的排序記錄&#xff0c;在排序過程中需要訪問外存。常見的內部排序算法有&#xff1a;插入排序、希爾排序、選擇排序…

最新海康攝像機、NVR、流媒體服務器、回放取流RTSP地址規則說明

本文檔主要介紹海康威視設備預覽、回放、流媒體取流的RTSP URL和IE直接預覽、回放的HTTP URL。RTSP為取流協議&#xff0c;取到碼流后需要解碼顯示&#xff0c;可以通過VLC播放器進行測試&#xff0c;IE等瀏覽器網頁不支持RTSP協議直接取流預覽或者回放。網頁上需要跳過登錄界面…

pug模板引擎(原jade)

前面的話 為什么要引入pug&#xff0c;pug有什么特別之處呢&#xff1f;有一些嵌套層次較深的頁面&#xff0c;可能會出現巢狀嵌套&#xff0c;如下圖所示 在后期維護和修改時&#xff0c;一不小心少了一個尖括號&#xff0c;或者某個標簽的開始和閉合沒有對應上&#xff0c;就…

python安裝環境傻瓜式安裝_前后端分離——前端開發環境傻瓜式一步到位 nodejs ruby python nginx 安裝搭建配置...

前端開發環境一步到位 一、準備工作 nodejs安裝 安裝&#xff1a;next->next.... Ruby安裝 安裝&#xff1a;next->next.... 需要配置到path&#xff1a;將安裝目錄復制到環境變量中&#xff0c;跟jdk環境變量配置一樣。 注意下一步&#xff1a;Python安裝 安裝&#xff…

【Python】Python學到什么程度可以面試工作?------持續更新 ...

前言&#xff1a; 從事python學習&#xff0c;有爬蟲、web后臺、深度學習相關經驗&#xff0c; 坐標北京歡迎騷擾。 本答案力求簡潔和直擊重點&#xff0c;代碼部分使用Python3&#xff0c;更詳細的解釋請Google&#xff0c;回答有誤請務必提醒答主&#xff0c;我將及時改正。…

H.264的碼率控制算法

H&#xff0e;264的碼率控制算法采用了多種技術&#xff0c;其中包括自適應基本單元層(Adaptive Basic Unit Layer)、流量往返模型(Fluid Traffic Model)、線性MAD模型、二次率失真模型等。并且采用了分層碼率控制策略&#xff0c;共分為三層&#xff1a;GOP層、幀層和基本單元…

消息中間件Client模塊劃分

上圖是之間討論確定的系統架構&#xff08;后續內容會按照這個架構來敘述&#xff09;&#xff0c;其中&#xff1a; 客戶端包含Producer和Consumer兩大塊 客戶端需要和NameServer交互來獲取元數據 客戶端需要和Broker交互來讀寫消息 Client模塊劃分 1. 網絡模塊 第一個仍然是…

詳解HashMap數據結構實現

HashMap的設計是由數組加鏈表的符合數據結構&#xff0c;在這里用自己的語言以及結合源碼去總結一下&#xff0c;如果有不對的地方希望評論指正&#xff0c;先拱手謝謝。 HashMap是日常中非常常用的一種數據結構&#xff0c;我們要想深入了解學習任何一門技術&#xff0c;都是要…

java web開發學習手冊_Java 人必備學習手冊開發下載!

今天給大家分享一套 5000 頁的 Java 學習手冊&#xff0c;新鮮出爐&#xff01;此手冊內容專注 Java技術&#xff0c;包括 JavaWeb&#xff0c;SSM&#xff0c;Linux&#xff0c;Spring Boot&#xff0c;MyBatis&#xff0c;MySQL&#xff0c;Nginx&#xff0c;Git&#xff0c;…

Django初次體驗

Django初次體驗 關于django的安裝&#xff0c;寶寶們可以參考django簡介以及安裝 Django框架的搭建 在終端中進入需要建立項目的目錄 執行&#xff1a; django-admin startproject mysite其中&#xff0c;mysite是項目目錄名&#xff0c;可以自定義 我們來看看startprojec…

【LeetCode-面試算法經典-Java實現】【002-Add Two Numbers (單鏈表表示的兩個數相加)】...

【002-Add Two Numbers (單鏈表表示的兩個數相加)】 原題 You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked…

關鍵幀 關于decode_one_frame函數

田克平(94338047) 16:57:34能自己設置某幀為關鍵幀嗎&#xff1f; 抱柱者(86311414) 16:57:59to 田克平可以 田克平(94338047) 17:00:00呵呵&#xff0c;把丟包后的下一幀設置為I幀可以嗎&#xff1f;來處理丟幀現象 ☆雪天/kf☆(279373002) 17:00:42這個難度大了 田克平(94338…

不出現php version網頁_php冷知識 - 從命令行參數列表中獲取選項

分享一個php的冷知識 - &#xff0c;從命令行參數列表中獲取選項用到的函數是getopt 說明函數簽名是這樣的getopt ( string $options [, array $longopts [, int &$optind ]] ) : array|bool false解析傳入腳本的選項&#xff0c;成功返回數組&#xff0c;解析失敗返回fals…

【機器學習】opencv-攝像頭中的人臉采集

本次在視頻識別的程度上增添了攝像頭實時識別&#xff0c; 區別在于&#xff1a; # v cv2.VideoCapture(./dzd2.mp4) v cv2.VideoCapture(0) import numpy as npimport cv2face_detector cv2.CascadeClassifier(./haarcascade_frontalface_alt2.xml) # v cv2.VideoCapt…