zoukankan      html  css  js  c++  java
  • 146.包含某一项最长上升子序列

    2188 最长上升子序列

     

     时间限制: 1 s
     空间限制: 32000 KB
     题目等级 : 钻石 Diamond

    题目描述 Description

    LIS问题是最经典的动态规划基础问题之一。如果要求一个满足一定条件的最长上升子序列,你还能解决吗?

        给出一个长度为N整数序列,请求出它的包含第K个元素的最长上升子序列。

        例如:对于长度为6的序列<2,7,3,4,8,5>,它的最长上升子序列为<2,3,4,5>,但如果限制一定要包含第2个元素,那么满足此要求的最长上升子序列就只能是<2,7,8>了。

    输入描述 Input Description

    第一行为两个整数N,K,如上所述。

        接下来是N个整数,描述一个序列。

     

    输出描述 Output Description

    请输出两个整数,即包含第K个元素的最长上升子序列长度。

    样例输入 Sample Input

    8 6

    65 158 170 299 300 155 207 389

    样例输出 Sample Output

    4

    数据范围及提示 Data Size & Hint

    80%的数据,满足0

        100%的数据,满足0

    分类标签 Tags 点此展开 

    基本思路:
    k之前的数正常更新
    设置一个flag数组判断k+1之后的数,是不是由k更新过来的。
    代码:
    #include< iostream >
    using namespace std;
    #include< cstdio >
    #define N 200001
    int num[N],len[N];
    bool flag[N];
    int n,anslen=-N;
    int main()
    {
    int k;
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;++i)
    {
    scanf("%d",&num[i]);
    len[i]=1;
    if(i<=k&&i>=2)
    {
    for(int j=1;j<=i-1;++j)
    {
    if(len[j]+1>len[i]&&num[j]
    len[i]=len[j]+1;
    }
    }
    flag[k]=1;
    if(i>=k)
    {
    for(int j=k;j<=i-1;++j)
    {
    if(len[j]+1>len[i]&&num[j]
    {
    len[i]=len[j]+1;
    flag[i]=1;
    }
    }
    if(len[i]>anslen&&flag[i])
    anslen=len[i];
    }
    }
    cout<<anslen<<endl;
    return 0;
    }
  • 相关阅读:
    POJ 2636:Electrical Outlets
    POJ 2260:Error Correction
    POJ 2080:Calendar
    POJ 2017:Speed Limit
    POJ 1504:Adding Reversed Numbers
    POJ 1477:Box of Bricks
    POJ 1060:Modular multiplication of polynomials
    HDU 1379:DNA Sorting
    HDU 1009:FatMouse' Trade
    mysql修改初始密码
  • 原文地址:https://www.cnblogs.com/c1299401227/p/5370695.html
Copyright © 2011-2022 走看看