1. 程式人生 > >dp最長遞增子序列的nlogn演算法實現

dp最長遞增子序列的nlogn演算法實現

n2的演算法很簡單,這裡是利用另外一個數組d,d[i]存的是長度為i的最末尾元素。因為d[i]是有序的,可以用二分查詢優化,複雜度降低為nlogn,程式碼如下,注意二分查詢的邊界:

#include <iostream>  
#include <cstdio>  
#include <cstring>  
using namespace std;  
const int N = 41000;  
int a[N];       //a[i] 原始資料  
int d[N];       //d[i] 長度為i的遞增子序列的最小值  
  
int BinSearch(int key, int* d, int low, int high)  
{  
    while(low<=high)  
    {  
        int mid = (low+high)>>1;  
        if(key>d[mid] && key<=d[mid+1])  
            return mid;  
        else if(key>d[mid])  
            low = mid+1;  
        else  
            high = mid-1;  
    }  
    return 0;  
}  
  
int LIS(int* a, int n, int* d)  
{  
    int i,j;  
    d[1] = a[1];  
    int len = 1;        //遞增子序列長度  
    for(i = 2; i <= n; i++)  
    {  
        if(d[len]<a[i])  
            j = ++len;  
        else  
            j = BinSearch(a[i],d,1,len) + 1;  
        d[j] = a[i];  
    }  
    return len;  
}  
  
int main()  
{  
    int t;  
    int p;  
    scanf("%d",&t);  
    while(t--)  
    {  
        scanf("%d",&p);  
        for(int i = 1; i <= p; i++)  
            scanf("%d",&a[i]);  
        printf("%d\n",LIS(a,p,d));  
    }  
    return 0;  
}  

相關推薦

dp遞增序列nlogn演算法實現

n2的演算法很簡單,這裡是利用另外一個數組d,d[i]存的是長度為i的最末尾元素。因為d[i]是有序的,可以用二分查詢優化,複雜度降低為nlogn,程式碼如下,注意二分查詢的邊界: #include

dp-遞增序列 (LIS)

一個數 bsp 註意 str 只有一個 自然 end alt ace 首先引出一個例子 問題 :   給你一個長度為 6 的數組 , 數組元素為 { 1 ,4,5,6,2,3,8 } , 則其最長單調遞增子序列為 { 1 , 4 , 5 , 6 , 8 } , 並且長度

遞增序列---nlogn的解法

題目描述: 給出長度為N的陣列,找出這個陣列的最長遞增子序列。(遞增子序列是指,子序列的元素是遞增的) 例如:5 1 6 8 2 4 5 10,最長遞增子序列是1 2 4 5 10。 Input 第1行:1個數N,N為序列的長度(2 <= N <= 500

遞增序列優化演算法(時間複雜度為nlgn)C++實現

最長遞增子序列優化演算法(時間複雜度為nlgn) // 最長遞增子序列優化演算法.cpp : Defines the entry point for the console application. /

公共序列nlogn演算法

求兩個序列的最大公共子序列(LCS),普遍的動態規劃演算法時間複雜度為O(n^2),在兩個序列的長度很長的時候執行時間過長。 可以轉化為最長上升子序列(LIS)來求,時間複雜度可以優化到nlogn。 1.首先說一下轉化為LIS的方法:   找到s1序列中每

上升序列 LIS演算法實現

最長上升子序列LIS演算法實現 LIS(Longest Increasing Subsequence)最長上升(不下降)子序列 有兩種演算法複雜度為O(n*logn)和O(n^2)。在上述演算法中,若使用樸素的順序查詢在D1..Dlen查詢,由於共有O(n)個元素需要計算,每次計算時的複雜度

遞增序列 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。下面

51nod 1376 遞增序列的數量(不是dp哦,線段樹 +  思維)

sort 是個 can stream const 方便 long 序列 printf 題目鏈接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1376 題解:顯然這題暴力的方法很容易想到

51nod 1218 遞增序列 V2(dp + 思維)

ear www str tdi binsearch tor con bsp href 題目鏈接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1218 題解:先要確定這些點是不是屬於最長

DP簡單問題聯系--遞增序列+公共序列

text 個數 -- col tle space iostream 子序列 一行 今天重溫了一下dp問題,發現自己兩個禮拜不寫題目就什麽都不會了。。。心態爆炸,感覺去考試怕是要gg了。。。 不過今天總結一下寫的題目,全部都是基礎的dp問題 第一個是 求最長不下降子序列

DPL_1_D Longest Increasing Subsequence dp+二分查詢 遞增序列

For a given sequence A = {a0, a1, ... , an-1}, find the length of the longest increasing subsequnece (LIS) in A. An increasing subsequenc

Longest Ordered Subsequence (遞增序列的長度)(序列dp

A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let the subsequence of the given numeric sequen

遞增序列問題(演算法導論作業15.4-5、15.4-6)

問題描述 對於長度為n的序列S[1...n],找出長度最大的子序列,其子序列的每個元素均遞增。 15.4-5、時間複雜度O(n^2) 剛看到這題時,想到了個投機取巧的方法。因為書中此節介紹了LCS(最長公共子序列)演算法,於是可以直接將這個序列排序O(nlogn),然後

hdu 5748 Bellovin【nlogn遞增序列

Peter has a sequence a1,a2,...,an and he define a function on the sequence -- F(a1,a2,...,an)=(f1,f2,...,fn), where fi is the length of the longest incr

遞增序列的三種演算法

問題 給定一個長度為N的陣列,找出一個最長的單調自增子序列(不一定連續,但是順序不能亂)。例如:給定一個長度為6的陣列A{5, 6, 7, 1, 2, 8},則其最長的單調遞增子序列為{5,6,7,8},長度為4. 解法1:最長公共子序列法 這個問題可以轉換為最長公共子序列問題。如例子中的陣列A{5,

遞增序列LIS的O(nlogn)的求法

最長遞增子序列(Longest Increasing Subsequence)是指n個數的序列的最長單調遞增子序列。比如,A = [1,3,6,7,9,4,10,5,6]的LIS是1 3 6 7 9 10。我們現在希望程式設計求出一個給定的陣列,我們能得到LIS

遞增序列,時間複雜度(O(nlogn))

package com.kailong.datastures; import java.util.Arrays; /** * Created by Administrator on 2017/4/17. * 最長遞增子序列 */ public class Find

LeetCode 遞增序列的O(nlogn)詳解

/***************************************************************************** * * Given an unsorted array of integers, find t