LIS O(n^2)模板

dp[j] = max(dp[k]+1,dp[j])(0<k<j&a[j]>a[k])

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <stack>
#include <queue>
#include <algorithm>
using namespace std;

const int inf = (1<<31)-1;
const int MAXN = 5e5+10;

int dp[MAXN];
int a[MAXN];

int main()
{
    int n;
    int mmax;
    while(~scanf("%d",&n)){
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        dp[1] = 1;
        mmax = 1;
        for(int i=2;i<=n;i++){
            for(int j=1;j<i;j++){
                if(a[i]>a[j]){
                    dp[i] = max(dp[j]+1,dp[i]);
                }
            }
            mmax = max(mmax,dp[i]);
        }
        cout<<mmax<<endl;
    }
    return 0;
}

时间: 2024-10-25 04:02:32

LIS O(n^2)模板的相关文章

LIS n^2&amp;nlogn模板

LIS nlogn模板 http://acm.hdu.edu.cn/showproblem.php?pid=1950 #include <iostream> #include <stdio.h> #include <algorithm> #include <string> #include <math.h> #include <stdlib.h> #define maxn 40000+10 using namespace std; i

What Goes Up UVA - 481 LIS+打印路径 【模板】

打印严格上升子序列: #include<iostream> #include<cstdio> #include<algorithm> #include<cstdlib> #include<cstring> #include<string> #include<cmath> #include<map> #include<set> #include<vector> #include<qu

P2757 导弹的召唤(数据加强)

传送门 LIS的O(nlgn)模板题.加强"导弹拦截" #include <cstdio> #include <cstring> #include <algorithm> #define INF 0x3f3f3f3f using namespace std; bool cmp(int x,int y) { return x>=y;} int ulis(int *dp,const int *a,int n) { for(int i=0; i<

【模板】LIS模板 洛谷P1091 [NOIP2004提高组]合唱队形 [2017年4月计划 动态规划11]

以题写模板. 写了两个:n^2版本与nlogn版本 P1091 合唱队形 题目描述 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK, 则他们的身高满足T1<...<Ti>Ti+1>…>TK(1<=i<=K). 你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形. 输入输出格

最长上升子序列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

LIS严格递增和非递减模板

2017-09-10 16:51:03 writer:pprp 严格递增的LIS模板 #include<stdio.h> #include<string.h> #include<algorithm> #include <vector> #include <iostream> using namespace std; int a[10] = {0,1,5,3,6,9}; vector<int> v; int main() { v.cle

动态规划模板1|LIS最长上升子序列

LIS最长上升子序列 dp[i]保存的是当前到下标为止的最长上升子序列的长度. 模板代码: int dp[MAX_N], a[MAX_N], n; int ans = 0; // 保存最大值 for (int i = 1; i <= n; ++i) { dp[i] = 1; for (int j = 1; j < i; ++j) { if (a[j] < a[i]) { dp[i] = max(dp[i], dp[j] + 1); } } ans = max(ans, dp[i]); }

【luogu1439】 【模板】最长公共子序列 [动态规划][LIS最长上升子序列][离散化]

P1439 [模板]最长公共子序列 此思路详见luogu第一个题解 一个很妙的离散化 刘汝佳蓝书上面的LIS 详见蓝书 d[i]以i为结尾的最长上升子序列的长度     g[i]表示d值为i的最小状态的编号即长度为i的上升子序列的最小末尾值 1 for(int i=1;i<=n;++i) scanf("%d",&a[i]); 2 for(int i=1;i<=n;++i) 3 { 4 int k=lower_bound(g+1,g+1+n,a[i])-g; 5 d[

LIS模板题(Longest Ordered Subsequence)

LIS模板题(Longest Ordered Subsequence) poj-2533 给出一个序列,求出这个序列的最长上升子序列. 序列A的上升子序列B定义如下: B为A的子序列 B为严格递增序列 Input 第一行包含一个整数n,表示给出序列的元素个数. 第二行包含n个整数,代表这个序列. 1 <= N <= 1000 Output 输出给出序列的最长子序列的长度. Sample Input 7 1 7 3 5 9 4 8 Sample Output 4 #include <std