1. 程式人生 > >最長單調遞增子序列O(nlogn)

最長單調遞增子序列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(≤10​5​​);第2行給出n個整數,其間

連續遞增序列(java)

給定一個順序儲存的線性表,請設計一個演算法查詢該線性表中最長的連續遞增子序列。例如,(1,9,2,5,7,3,4,6,8,0)中最長的遞增子序列為(3,4,6,8)。 輸入格式: 輸入第1行給出正整數n(≤10​5​​);第2行給出n個整數,其間以空格分隔。 輸出格式: