最長單調遞增子序列O(nlogn)
#include "iostream"
#include "fstream"
using namespace std;
/*
b[k]表示長度為i的子序列c[i]中,長度為k的最長單調遞增子序列的最小結尾元素值
當c[i]>=b[k], k = k + 1; b[k] = c[i]
否則,將c[i]放置到b[]中適當位置
*/
int b[100];
int c[100];
//二分搜尋法在b[1,k]中找到下標h,使得b[h-1]<=c[i]<=b[h]
int binary(int i, int k)
{
int l, h;
if(c[i] < b[1])
return 1;
for(l=1, h=k; l!=h-1;)
{
if(b[k=(l+h)/2] <= c[i])
l = k;
else
h = k;
}
return h;
}
int increase(int n)
{
int i = 1, k;
b[1] = c[1];
for(i=2, k=1; i<=n; i++)
if(c[i] >= b[k])
b[++k] = c[i];
else
b[binary(i, k)] = c[i];
return k;
}
int main()
{
int n;
cout << "輸入序列長度:" ;
cin >> n;
cout << "輸入子序列:";
for(int i=1; i<=n; i++)
cin >> c[i];
int count = increase(n);
cout << "最長單調遞增子序列為:" << count << endl;
return 0;
}
相關推薦
最長單調遞增子序列O(nlogn)
#include "iostream" #include "fstream" using namespace std; /* b[k]表示長度為i的子序列c[i]中,長度為k的最長單調遞增子序列的最小
最長單調遞增子序列( O(nlgn) )
最長單調遞增子序列 設A是n個不同正整數構成的序列,求A的一個最長遞增子序列。例如序列為1,5,3,8,10,6,4,9;它的最長遞增子序列為1,5,8,10;1,5,8,9;...。 這是一道很典型的動態規劃題目。設fi表示結尾元素為原序列中第i個元素
時間複雜度為O(nlogn)的最長單調遞增子序列
寫一記,其中利用二分查詢法,具體分析見程式設計之美。 #include <iostream> using namespace std; #define N 20 int binarySearch(int src[], int des, int low, int
最長單調遞增子序列(O(n^2))
#include "iostream" #include "fstream" using namespace std; /* b[i]表示長度為i的子序列c[i]中,由若干元素組成的最長單調遞增子序列
[dp]最長單調遞增子序列
bsp 存在 ont for printf iss 需要 hellip 註意 https://www.51nod.com/tutorial/course.html#!courseId=12 解題關鍵: 如果將子序列按照長度由短到長排列,將他們的最大元素放在一起,形成新序
[C++] 動態規劃之矩陣連乘、最長公共子序列、最大子段和、最長單調遞增子序列
每次 種子 () return 避免 amp 可能 text com 一、動態規劃的基本思想 動態規劃算法通常用於求解具有某種最優性質的問題。在這類問題中,可能會有許多可行解。每一個解都對應於一個值,我們希望找到具有最優值的解。 將待求解問題分解成若幹個子問題,先求
NYOJ17 最長單調遞增子序列 線性dp
tar 最長 using print code \n clu sca can 題目鏈接: http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=17 分析: i=1 dp[i]=1 i!=1 dp[i]=max(dp[j]+
動態規劃——最長單調遞增子序列
題目描述 用動態規劃設計一個演算法,要求找出由n個整陣列成的序列的最長單調遞增子序列的個數(假設所有的元素都不相同)。 輸入 第一行輸入一個整數,表示有n個整數。 第二行輸入n個整數。 輸出 第三行輸出最長單調遞增子序列的個數。 樣例輸入 6 1 3 2 5
動態規劃之最長單調遞增子序列(C++原始碼)
動態規劃之最長單調遞增子序列 問題: L={a1,a2,a3,…,an}既L是由n個不同的實陣列成的序列,求L的最長單調遞增子序列(下標可不連續)。 分析: 設輔助陣列b,b[i]表示以a[i]為結尾的最長遞增子序列的長度,最長遞增子序列的長度,就是陣列b的最大
最長單調遞增子序列的三種解法
問題描述:找出由n個數組成的序列的最長單調遞增子序列 解法一:轉化成LCS問題求解,時間複雜度為O(n*n). 思路:原序列為A,把A按升序排序得到序列B,求出A,B序列的最長公共子序列,即為A的最長
nyoj 17 資料結構 最長單調遞增子序列
單調遞增最長子序列 時間限制:3000 ms | 記憶體限制:65535 KB 難度:4 描述求一個字串的最長遞增子序列的長度 如:dabdbf最長遞增子序列就是abdf,長度為4
最長單調遞增子序列--幾種方法
設給定的序列為num[n] 1.O(n^2)的求法 動態規劃的方法 狀態定義:設dp[i] 表示以num[i]結尾的最長單調遞增子序列的長度 狀態方程:dp[i] = max(dp[k] + 1
最長遞增子序列 O(NlogN)演算法 ( DP + 二分查詢)
看了好久好久,現在終於想明白了。 試著把它寫下來,讓自己更明白。 最長遞增子序列,Longest Increasing Subsequence 下面我們簡記為 LIS。 排序+LCS演算法 以及 DP演算法就忽略了,這兩個太容易理解了。 假設存在一個序列d[1..9] = 2 1 5 3 6 4 8 9 7,
最長遞增子序列 O(NlogN)演算法
今天回顧WOJ1398,發現了這個當時沒有理解透徹的演算法。看了好久好久,現在終於想明白了。試著把它寫下來,讓自己更明白。最長遞增子序列,Longest Increasing Subsequence 下面我們簡記為 LIS。排序+LCS演算法 以及 DP演算法就忽略了,這兩
最長遞增子序列O(NlogN)演算法(leetcode 300. Longest Increasing Subsequence )
最長遞增子序列,Longest Increasing Subsequence 下面我們簡記為 LIS。排序+LCS演算法 以及 DP演算法就忽略了,這兩個太容易理解了。假設存在一個序列d[1..9] = 2 1 5 3 6 4 8 9 7,可以看出來它的LIS長度為5。下面
hdu 5532【最長非遞增子序列 時間復雜度 nlogn】
int urn 思路 while 最小值 復雜 include hdu nlogn http://acm.split.hdu.edu.cn/showproblem.php?pid=5532 題意:由n個數組成的序列,如果去掉一個數後仍保持非遞增或者非遞減,則輸出YES,否
習題3.4 最長連續遞增子序列(20 分)浙大版《數據結構(第2版)》題目集
space align font list 格式 ott mar 不能 第一次 給定一個順序存儲的線性表,請設計一個算法查找該線性表中最長的連續遞增子序列。例如,(1,9,2,5,7,3,4,6,8,0)中最長的遞增子序列為(3,4,6,8)。 輸入格式: 輸入
7-7 最長連續遞增子序列(20 分) 普通STL解出
這道題我看了一下 決定寫。 在寫之前網上看到很多高手的題解,深表敬意。 只是我想用STL來完成一下這道題。 7-7 最長連續遞增子序列(20 分) 給定一個順序儲存的線性表,請設計一個演算法查詢該線性表中最長的連續遞增子序列。例如,(1,9,2,5,7,3,4,
資料結構-最長連續遞增子序列
7-9 最長連續遞增子序列 (20 分) 給定一個順序儲存的線性表,請設計一個演算法查詢該線性表中最長的連續遞增子序列。例如,(1,9,2,5,7,3,4,6,8,0)中最長的遞增子序列為(3,4,6,8)。 輸入格式: 輸入第1行給出正整數n(≤105);第2行給出n個整數,其間
最長連續遞增子序列(java)
給定一個順序儲存的線性表,請設計一個演算法查詢該線性表中最長的連續遞增子序列。例如,(1,9,2,5,7,3,4,6,8,0)中最長的遞增子序列為(3,4,6,8)。 輸入格式: 輸入第1行給出正整數n(≤105);第2行給出n個整數,其間以空格分隔。 輸出格式: