日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

小明系列问题――小明序列(LIS)

發布時間:2023/11/29 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 小明系列问题――小明序列(LIS) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
小明系列問題――小明序列 Time Limit:1000MS?????Memory Limit:32768KB?????64bit IO Format:%I64d & %I64u Submit?Status?Practice?HDU 4521

Description

大家都知道小明最喜歡研究跟序列有關的問題了,可是也就因為這樣,小明幾乎已經玩遍各種序列問題了。可憐的小明苦苦地在各大網站上尋找著新的序列問題,可是找來找去都是自己早已研究過的序列。小明想既然找不到,那就自己來發明一個新的序列問題吧!小明想啊想,終于想出了一個新的序列問題,他欣喜若狂,因為是自己想出來的,于是將其新序列問題命名為“小明序列”。?

  提起小明序列,他給出的定義是這樣的:?
  ①首先定義S為一個有序序列,S={ A1 , A2 , A3 , ... , An },n為元素個數 ;?
  ②然后定義Sub為S中取出的一個子序列,Sub={ Ai1 , Ai2 , Ai3 , ... , Aim },m為元素個數 ;?
  ③其中Sub滿足 Ai1 < Ai2 < Ai3 < ... < Aij-1 < Aij < Aij+1 < ... < Aim ;?
  ④同時Sub滿足對于任意相連的兩個Aij-1與Aij都有 ij - ij-1 > d (1 < j <= m, d為給定的整數);?
  ⑤顯然滿足這樣的Sub子序列會有許許多多,而在取出的這些子序列Sub中,元素個數最多的稱為“小明序列”(即m最大的一個Sub子序列)。?
  例如:序列S={2,1,3,4} ,其中d=1;?
  可得“小明序列”的m=2。即Sub={2,3}或者{2,4}或者{1,4}都是“小明序列”。?

  當小明發明了“小明序列”那一刻,情緒非常激動,以至于頭腦凌亂,于是他想請你來幫他算算在給定的S序列以及整數d的情況下,“小明序列”中的元素需要多少個呢??

Input

輸入數據多組,處理到文件結束;?
  輸入的第一行為兩個正整數 n 和 d;(1<=n<=10^5 , 0<=d<=10^5)?
  輸入的第二行為n個整數A1 , A2 , A3 , ... , An,表示S序列的n個元素。(0<=Ai<=10^5)

Output

請對每組數據輸出“小明序列”中的元素需要多少個,每組測試數據輸出一行。

Sample Input

2 0 1 2 5 1 3 4 5 1 2 5 2 3 4 5 1 2

Sample Output

2 2 1

?

#include<bits/stdc++.h> using namespace std; const int M = 1e5 + 10 , inf = 0x3f3f3f3f; int n , d ; int a[M] , Top[M] , maxn[M]; int judge (int x) {int l = 0 , r = n ;int ret = l ;while (l <= r) {int mid = l + r >> 1 ;if (x > Top[mid]) {l = mid+1 ;ret = mid ;}else r = mid-1 ;}return ret+1 ; }void solve () {int ans = 0 ;for (int i = 1 ; i <= n ; i ++) {maxn[i] = judge (a[i]) ;ans = max (maxn[i] , ans) ;int j = i-d ;if (j > 0) Top[ maxn[j] ] = min (Top[ maxn[j] ] , a[j] ) ;}printf ("%d\n" , ans ) ; }int main () {while (~ scanf ("%d%d" , &n , &d)) {Top[0] = -inf ;for (int i = 1 ; i <= n ; i ++) {scanf ("%d" , &a[i]) ;Top[i] = inf ;}solve () ;}return 0 ; }

  我想大多數人寫LIS,都不會設置一個數組去記錄以每個值結尾的最長子序列的LIS,因為:

1.我們一般只關心整體的LIS。

2.一般求出子序列的LIS就立刻拿去跟新Top[lis]了,哪里需要存在一個數組里。

然后這就導致一個梗了,我完全沒有想過局部lis還有什么用。

就這道題目而言,思路其實就四個字:

延遲跟新。

每次跟新都延遲d次。

轉載于:https://www.cnblogs.com/get-an-AC-everyday/p/4761754.html

總結

以上是生活随笔為你收集整理的小明系列问题――小明序列(LIS)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。