HDOJ1800(最长上升子序列个数)

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int MAX_N=3005;
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        if(n==0)
        {
            printf("0\n");
            continue;
        }
        int a[MAX_N];
        for(int i=0; i<n; i++)
        {
            scanf("%d",&a[i]);
        }
        sort(a,a+n);
        int u[MAX_N]={0};
        u[0]=a[0];
        int i, j;
        int k=1;
        for(i=1; i<n; i++)
        {
            for(j=0; j<k; j++)
            {
                if(u[j]<a[i])
                {
                    u[j]=a[i];
                    break;
                }
            }
            if(j==k)
            {
                u[k++]=a[i];
            }
        }
        printf("%d\n",k);
    }
    return 0;
}
时间: 2025-01-13 22:47:06

HDOJ1800(最长上升子序列个数)的相关文章

codevs 1862 最长公共子序列(求最长公共子序列长度并统计最长公共子序列的个数)

题目描述 Description 字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字符序列X="x0,x1,-,xm-1",序列Y="y0,y1,-,yk-1"是X的子序列,存在X的一个严格递增下标序列<i0,i1,-,ik-1>,使得对所有的j=0,1,-,k-1,有xij = yj.例如,X="ABCBDAB",Y="BCDB"是X的一个子序

[BZOJ2423][HAOI2010]最长公共子序列

试题描述 字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字符序列X=“x0,x1,…,xm-1”,序列Y=“y0,y1,…,yk-1”是X的子序列,存在X的一个严格递增下标序列<i0,i1,…,ik-1>,使得对所有的j=0,1,…,k-1,有xij = yj.例如,X=“ABCBDAB”,Y=“BCDB”是X的一个子序列.对给定的两个字符序列,求出他们最长的公共子序列长度,以及最长公共子序列个数. 输入 第1行为第1个字

【DP】最长公共子序列

Description 字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字符序列X="x0,x1,-,xm-1",序列Y="y0,y1,-,yk-1"是X的子序列,存在X的一个严格递增下标序列<i0,i1,-,ik-1>,使得对所有的j=0,1,-,k-1,有xij = yj.例如,X="ABCBDAB",Y="BCDB"是X的一个子序列. 对给

UVA - 10635 最长公共子序列

input n,p,q 2<=n<=250 1<=p,q<=n*n 1 a1 a2 a3 ... ap 1<ai<n*n,ai!=aj 1 b1 b2 b3 ... bq 1<bi<n*n,bi!=bj output 最长公共子序列个数 做法:将b数组中的数变为a数组中数的下标,a中不存在的数可以去掉,然后求LIS即可 #include <cstdio> #include <queue> #include <cstring>

算法系列笔记6(动态规划—最长公共子序列/串lcs)

子序列要求元素顺序一致就可以了,而字串必须是连续的.如ABCBDAB与BDCABA两个字符串,最长公共子序列有BCBA.BDAB和BCAB, 而最长公共字串只有AB和BD<连续>.当然这里的求解只求一个,但通常是这样直接说求最长公共子串,子序列,准确的应该是之一. 最长公共子序列 法一:穷举法 检查字符串x所有字序列,共有2^m个,检查它是否在y字符串中出现,每个需要O(n),时间复杂度为指数级的. 法二:动态规划(DP) 将两个字符串x[1-m]和y[1-n]放在x轴和y轴方向上便得到一个二

[BZOJ 2423] [HAOI2010] 最长公共子序列

2423: [HAOI2010]最长公共子序列 Time Limit: 10 SecMemory Limit: 128 MB Description 字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字符序列X=“x0,x1,…,xm-1”,序列Y=“y0,y1,…,yk-1”是X的子序列,存在X的一个严格递增下标序列<i0,i1,…,ik-1>,使得对所有的j=0,1,…,k-1,有xij = yj.例如,X=“ABCBDA

[HAOI2010]最长公共子序列

[问题描述] 字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字符序列x="x0,x1,-,xn-1", 序列Y="y0,y1,-,yk-1是X的子序列,存在X的一个严格递增下标序 列<i0,i1,-,ik-1>,使得对所有的j=0,1,-,k- 1,有xij="yj. 例如,x="ABCBDAB",Y="BCDB"是X的一个子序列. 对给定的两

[OI笔记] 最长上升子序列与网络流建模

与最长上升子序列相关的网络流问题: 给定一个序列 A[1..n] ,求出 A 的最长上升子序列长度.并且回答下列询问: (1) 如果每个点只能用一次,能从 A 中取出几个最长上升子序列? (2) 如果第 1 个点和第 n 个点可以用任意次,能从 A 中取出几个最长上升子序列? (3) 如果每个点有一个删除代价 Bi ,最小需要花费多少代价,才能使 A 的最长上升子序列至少减少 1 ? 首先,最长上升子序列问题使用 DP 来求解,从后向前枚举 i ,求出 f[i] 表示以 i 为开头的最长上升子序

最长公共子序列 与 最长公共连续子串

最长公共子序列 //最长公共子序列(个数) #include<iostream> using namespace std; int c[100][100]={0}; int len1,len2; int gcd(string a,string b){ len1=a.length(); len2=b.length(); int tmp=-1; for(int i=0;i<len1;i++) { for(int j=0;j<len2;j++){ if(a[i]==a[j]) c[i][