1. 程式人生 > >Java實現求最長增長子序列長度,並輸出該子序列值

Java實現求最長增長子序列長度,並輸出該子序列值

<pre name="code" class="java">import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class Main {
		public static void main(String args[]){
		Scanner sc = new Scanner(System.in);
		String str = sc.nextLine();
		String patternStr = "[\\d\\s]+"; 
		Matcher meq = Pattern.compile(patternStr).matcher(str);
		if(!meq.matches()){
			System.out.println("輸入格式有誤,請重新輸入!");
			System.exit(0);
		 }
		if(str.indexOf(" ")==-1){
			System.out.println(str);
		}else{
			String test[] = str.split(" ");
			int t[] = new int[test.length];
			for(int i=0;i<t.length;i++){
				t[i] = Integer.parseInt(test[i]);
			}
			find(t);
		}
		
		
	}

	  public static void find(int[] a)
	    {
	        int length = a.length;
	        int[] list = new int[length];// 儲存第i個元素之前的最長遞增序列值
	        for (int i = 0; i < length; i++)
	        {
	            list[i] = 1;
	            for (int j = 0; j < i; j++)
	            {
	                if (a[j] < a[i] && list[j] + 1 > list[i])
	                {
	                    list[i] = list[j] + 1;
	                }
	            }
	        }
	        int max = list[0];

	        for (int i = 0; i < length; i++)
	        {
	            if (list[i] > max)
	            {
	                max = list[i];
	            }
	        }
		System.out.println("最長子序列長度為:"+max);
//因為得到的list值為各個子序列的最大增長子序列值,所以max遞減,當list值與max相等時
//原陣列該下標處的值即為所求子序列值
	        int res[] = new int[max];
	     System.out.println("最長子序列為:");
		for (int i = length-1; i >= 0; i--) { 
			if (list[i] == max)
				 {
 					res[max-1] = a[i];
				 	max--; 
				}
		 }
		 for (int i = 0; i <res.length; i++)
		 {
			 System.out.print(res[i]+" ");
		 }
		 }
	}

一組測試資料下面為測試資料

1 5 8 3 6 7 2 9

1 3 5 2 4 6 7 8
3 8 10 4 12 5 6 8

35 36 39 3 15 27 6 42 

下面為輸出的最長子序列

1 3 6 7 9
1 2 4 6 7 8
3 4 5 6 8

3 15 27 42

根據傳統的lcs演算法求得一組list為各個下標處的最長子序列長度,

以第一組測試資料為例, 1 5 8 3 6 7 2 9

求得的子序列長度陣列為[1, 2, 3, 2, 3, 4, 2, 5],可以看出長度一次遞增,我們只需順序遞減,求得遞減的下標,即該數組裡5 4 3 2 1 的下標,7 5 4 3 0,

再取原陣列這些下標處的值,就可求得最長子序列陣列了,即1 3 6 7 9

相關推薦

Java實現長子序列長度輸出序列

<pre name="code" class="java">import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern; public cla

Java 實現迴文

下面以字串12212321為例,經過上一步,變成了 S[] = "$#1#2#2#1#2#3#2#1#";然後用一個數組 P[i] 來記錄以字元S[i]為中心的最長迴文子串向左/右擴張的長度(包括S[i],也就是把該回文串“對摺”以後的長度),比如S和P的對應關係: S 

長子序列(串)大公共序列(串)

子序列,不需要連續的。 思路一:傳統的dp,dp[i]表示前i個數且以第i個數字結尾的最長增長子序列,遍歷陣列,dp[i] = max(dp[i], dp[j] + 1)  if nums[i] > nums[j], j from 0 to i 思路二:維護一個

UVa 11404 回文序列(LCS回文串長度

ring vector 通過 spa include map 它的 思想 cstring https://vjudge.net/problem/UVA-11404 題意: 給定一個由小寫字母組成的字符串,刪除其中的0個或多個字符,使得剩下的字母(順序不變)組成一個盡量長

java迴文

一開始看到這個題目的時候,我就想到了第一種思路: (1)從頭遍歷每個字元,從該字元向兩邊擴充套件,直到字串最長界限或者兩邊擴充套件的字元不相等為止,記錄每個字元搜尋的長度,並且找最大的即為最長迴文子串個數。演算法優化的地方(當一個字元的擴充套件長度為整個字串長度時候,停止搜

編寫任意二叉樹中一條的路徑的演算法要求輸出此路徑上各結點的及路徑的長度

int Depth(BiTree T)/* 深度 */ { if(T==NULL) return(0); return 1+(Depth(T->lchild)>Depth(T->rchild)? Depth(T->lchild):Depth(T-&

Hdu 3068 Manacher演算法迴文串長度

最長迴文 Description 給出一個只由小寫英文字元a,b,c…y,z組成的字串S,求S中最長迴文串的長度. 迴文就是正反讀都是一樣的字串,如aba, abba等 Input 輸入有多組case,不超過120組,每組輸入為一行小寫英文字元a,b

一個一維維陣列中只有1和-1實現程式求和為0的長子長度在註釋中給出時間和空間複雜度

這是一個比動態規劃更簡單的解法。 思路就是在i從0到n,計算sum(i),sum(i)表示從0到i的元素之和。並儲存在字典dic中,value是索引i,在往後的遍歷中每得到一個sum(i)就檢視dic的keys是否已有此sum(i)值,如果有則用當前i位置減去儲存的i,並與

<Java>完成一個“可以由使用者鍵入文字內容輸出其字元個數”的Java應用程式

一、任務目標     完成一個 java application應用程式,可以接收使用者通過鍵盤輸入的文字,並輸出此段文字字元的個數。   二、Scanner類     Scanner是JDK1.5新增的一個類,可以使用該類建立一個物件。它是一個可以使用正則表示

java跨方法傳遞物件引用變數變數賦引起的問題

關於物件引用做方法引數問題,在java中 基本型別變數做引數傳另外一個方法中重新賦值時,會重新在棧中複製一份,物件引用也是一樣,如 public methodA(){ int i = 0; method

VB:編寫程式實現如下規律的5*5矩陣存入陣列輸出陣列

題目來源:大工慕課 連結 作者:Caleb Sung 題目要求 編寫程式,實現如下規律的5*5矩陣存入陣列,並輸出該陣列 1 1 1 1

poj1952遞減序列長子序列的種數

求最長遞減子序列和最長子序列的種數。難在求種數 不需要使用高精度或者int64 BUY LOW, BUY LOWER Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 5490 Accepted:

公共序列

ade empty 全部 str2 comm star 要求 longest strlen 最長公共子序列,英文縮寫為LCS(Longest Common Subsequence)。其定義是。一個序列 S 。假設各自是兩個或多個已知序列的子序列。且是全部符合此條件序列中

Bridging signals(上升自序列nlogn算法)

img idg bound des div figure block nal sta Bridging signals Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/

O(n log n)上升序列不下降序列

clas 每一個 for spa pen pan close color style 考慮dp(i)表示新上升子序列第i位數值的最小值.由於dp數組是單調的,所以對於每一個數,我們可以二分出它在dp數組中的位置,然後更新就可以了,最終的答案就是dp數組中第一個出現正無窮的位

LCS公共序列(DP)

遞推 劃分 get ima 維護 () arr har static 動態規劃並不是一種算法,而是一種解決問題的思路。典型的動態規劃問題,如最長公共子序列(LCS),最長單調子序列(LIS)等。 動態規劃分為四個步驟: 1.判斷問題是否具有最優子結構 這裏以LCS為例,X=

NOIP2016提高組初賽(2)四、讀程序寫結果3、回文序列

所有 並且 names mes font esp mic abcd 大小 #include <iostream> using namespace std; int lps(string seq, int i, int j) { int len1, len2;

不下降序列個數

turn %d span scanf namespace can 必須 ostream color 求最長不下降序列個數(jdoj-1946)     題目大意:給你一個序列,求所有最長不下降序列的個數。     註釋:n(總序列長度)<10000。      

java公共串的長度

length 如果 接下來 log light AC subst 子串 substring 1這道題目就是給定兩個字符串,然後求這兩個字符串的最長公共子串的最大長度,假設我的f()方法是來求兩個字符串的最大公共子串,從頭開始逐一比較,如果相等,則 繼續調用這個方法,使得遞歸

[LeetCode] 128. Longest Consecutive Sequence 連續序列

數組 set 序列 stat i++ cnblogs post sort bre Given an unsorted array of integers, find the length of the longest consecutive elements sequenc