java實現LIS演算法,出操隊形問題,lis隊形

來源:互聯網
上載者:User

java實現LIS演算法,出操隊形問題,lis隊形

假設有序列:2,1,3,5,求一個最長上升子序列就是2,3,5或者1,3,5,長度都為3。

LIS演算法的思想是:

設存在序列a。

① 如果只有一個元素,那麼最長上升子序列的長度為1;

② 如果有兩個元素,那麼如果a[1]>a[0],則最長上升子序列的長度為2,a[1]為該最長上升子序列的最後一個元素;若a[1]<a[0],則最長上升子序列的長度為1,a[0]和a[1]均為  其最長上升子序列的最後一個元素。

③ 如果由三個元素,那麼如果a[2]>a[0],a[2]>a[1],則a[2]可以作為a[0]或者a[1]所在最長上升子序列的最後一個元素。那選擇哪一個序列就要看a[0],a[1]哪個所在的序列要更長。

④ 擴充到n個元素,就是看以a[n]為最後一個元素的最長上升子序列的長度是多少。

 

定義兩個數組,一個是a,一個是b。

a存放未經處理資料,b[i]存放的是以a[i]結尾的最長上升子序列的長度。

 

代碼如下:

class Lmax{public static void Lmax(int[] a,int[] b){b[0]=1;                           for(int i=1;i<a.length;i++){int countmax=0;for(int j=0;j<i;j++){if(a[i]>a[j]&&b[j]>countmax){  countmax=b[j];   //記錄下元素數值比a[i]小的但是對應子序列最長的子序列長度}}b[i]=countmax+1;      //a[i]對應的最長子序列長度是}}}

 

 

 

二、出操隊形

題目描述:

在 讀高中的時候,每天早上學校都要組織全校的師生進行跑步來鍛煉身體,每當出操令吹響時,大家就開始往樓下跑了,然後身高矮的排在隊伍的前面,身高較高的就 要排在隊尾。突然,有一天出操負責人想了一個主意,想要變換一下隊形,就是當大家都從樓上跑下來後,所有的學生都隨機地佔在一排,然後出操負責人從隊伍中 抽取出一部分學生,使得隊伍中剩餘的學生的身高從前往後看,是一個先升高後下降的“山峰”形狀。據說這樣的形狀能夠給大家帶來好運,祝願大家在學習的道路 上勇攀高峰。(注,山峰只有一邊也符合條件,如1,1、2,2、1均符合條件)

輸入:

輸入可能包含多個測試範例。
對於每個測試案例,輸入的第一行是一個整數n(1<=n<=1000000):代表將要輸入的學生個數。
輸入的第二行包括n個整數:代表學生的身高(cm)(身高為不高於200的正整數)。

輸出:

對應每個測試案例,輸出需要抽出的最少學生人數。

範例輸入:

6

100 154 167 159 132 105

5

152 152 152 152 152

範例輸出:

0

4

 

在用LIS來解這道題的時候,可以這樣考慮:

首先從前向後用LIS求一遍以每一個元素結尾的最長上升子序列的長度,然後將數組逆序,再用LIS求一遍以每一個元素結尾的最長上升子序列的長度。

得到兩個數組b1,b2。

b1,b2對應相加再減去重複的一個,就是最長的'山峰'。

 

public class peak {public static void main (String[] args){int n;int re;do{   Scanner in = new Scanner(System.in);   n = in.nextInt();}while(n<0||n>100000);int []a = new int[n];                     //原始數組int []ar = new int[n];                    //逆序數組Scanner in = new Scanner(System.in); for(int i=0;i<n;i++){a[i]=in.nextInt();}int[] b1 = new int[n];@SuppressWarnings("unused")int[] b2 = new int[n];Lmax.Lmax(a, b1);ar=reverse.reverse(a);           Lmax.Lmax(ar, b2);              //求解逆序數組的最長上升子序列b2=reverse.reverse(b2);         //將逆序數組的最長上升子序列逆序以便和原始數組的最長上升子序列對應相加re = result.result(b1, b2);System.out.print(re);}}



 

 

class result{public static int result(int[] a,int[] b){int max=0;int[] c = new int[a.length];for(int i=0;i<a.length;i++){c[i]=a[i]+b[i];}Arrays.sort(c);max=c[c.length-1]-1;//對應相加最長的再減去重複的一個人return a.length-max;}}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.