最长上升子序列(模板)

转载请注明出处:http://blog.csdn.net/u012860063

一般的情况下:

#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;

int a[1005],dp[1005],n;

int LIS()
{
    int i,j,ans,m;
    dp[1] = 1;
    ans = 1;
    for(i = 2;i<=n;i++)
    {
        m = 0;
        for(j = 1;j<i;j++)
        {
            if(dp[j]>m && a[j]<a[i])
				m = dp[j];
        }
        dp[i] = m+1;
        if(dp[i]>ans)
			ans = dp[i];
    }
    return ans;
}

二分优化:

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;

int a[40005],dp[40005],n;

int bin(int size,int k)
{
    int l = 1,r = size;
    while(l<=r)
    {
        int mid = (l+r)/2;
        if(k>dp[mid])
            l = mid+1;
        else
            r = mid-1;
    }
    return l;
}

int LIS()
{
    int i,j,ans=1;
    dp[1] = a[1];
    for(i = 2; i<=n; i++)
    {
        if(a[i]<=dp[1])
            j = 1;
        else if(a[i]>dp[ans])
            j = ++ans;
        else
            j = bin(ans,a[i]);
        dp[j] = a[i];
    }
    return ans;
}

最长上升子序列(模板),布布扣,bubuko.com

时间: 2024-10-13 16:07:24

最长上升子序列(模板)的相关文章

最长上升子序列模板

//最长上升子序列(n^2) //入口参数:1.数组名称 2.数组长度(从0开始) int LIS(int a[],int len) { int *dp=new int[len]; int ans=1; dp[0]=1; for(int i=1;i<len;i++) { int m=0; for(int j=0;j<i;j++) if(dp[j]>m && a[j]<a[i]) m=dp[j]; dp[i]=m+1; ans=max(dp[i],ans); } re

最长公共子序列模板(LCS)模板

递归式: 实例图解: 代码: 1 #include<stdio.h> 2 #include<string.h> 3 const int N=111; 4 int dp[N][N],f[N][N]; 5 char a[N],b[N],c[N]; 6 void LCS(char *a,char *b,int la,int lb) 7 { 8 int i,j; 9 memset(dp,0,sizeof(dp)); 10 for(i=1;i<=la;i++) 11 { 12 for(

后缀数组 - 求最长公共子序列 + 模板题 : poj 2774

// Memory Time // 1347K 0MS // by : Snarl_jsb // 2014-09-24-19.57 #include<algorithm> #include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<vector> #include<queue> #include<stack>

最长公共子序列和最长公共子序列

最长公共子序列: 例如:abcfbc abfcb                答案是:4: 最长公共子串  :答案是: 2: 代码: 最长公共子序列: #include<cstdio> #include<cstring> #define max(x,y) (x>y?x:y) int len1,len2; int dp[1010][1010]; int bj[1010][1010]; char ch1[1010],ch2[1010]; void LCS() //lcs最长公共

模板 最长公共子序列

[模板]最长公共子序列 1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 using namespace std; 5 6 char s1[1000],s2[1000]; 7 int len1,len2,dp[1000][1000],mark[1000][1000];//如果数据太大,dp数组可以考虑滚动数组 8 9 void LCS() 10 { 11 int i,j; 12 mem

最长上升子序列LIS模板

1 ///最长上升子序列LIS模板 2 int BinSerch(int l,int r,int cut) 3 { 4 while (l<=r) 5 { 6 int m=(l+r)>>1; 7 if (cut>d[m]&&cut<=d[m+1]) return m; 8 if (cut>d[m]) l=m+1; 9 else r=m-1; 10 } 11 return 0; 12 } 13 14 int LIS(int n) 15 { 16 int le

模板 最长递增子序列

[模板]最长递增子序列 一般情况: 1 #include <stdio.h> 2 #include <algorithm> 3 #include <string.h> 4 using namespace std; 5 6 int a[1005],dp[1005],n; 7 8 int LIS() 9 { 10 int i,j,ans,m; 11 dp[1] = 1; 12 ans = 1; 13 for(i = 2;i<=n;i++) 14 { 15 m = 0;

hdu5773 最长上升子序列变形(附带模板)

先说说最长上升子序列的模板,时间复杂度O(nlogn) 最长上升子序列 #include <iostream> #include <cstdio> #include <cstring> using namespace std; const int N = 41000; int a[N],p; //a[i] 原始数据 int d[N]; //d[i] 长度为i的递增子序列的最小值 int BinSearch(int key, int low, int high)//二分查

P1439 【模板】最长公共子序列

开始打模板然后发现洛谷出现了一个新模板? 最长上升子序列. //Twenty #include<algorithm> #include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<vector> #include<cmath> #include<queue> #include<ctime> const