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