zoukankan      html  css  js  c++  java
  • LIS

    二分

    求一个序列的最长上升子序列个数。
    本程序采用边读边处理 + 二分法。

    ll f[maxn], ans = 1; //注意答案个数初始化为1
    
    int main()
    {
        ll n = read();
        for (int i = 1; i <= n; ++i)
        {
            int x = read();
            if (i == 1)
            {
                f[1] = x;
                continue;
            }
            int l = 1, r = ans, mid;
            while (l <= r)
            {
                mid = (l + r) >> 1;
                if (x <= f[mid])
                    r = mid - 1;
                else
                    l = mid + 1;
            }
            f[l] = x;
            if (l > ans)
                ++ans;
        }
        printf("%lld\n", ans);
        return 0;
    }
    
    

    dp

    int f[1050][1050], n, l, k;
    int main()
    {
        cin >> n;
        for (int i = 1; i <= n; i++)
        {
            cin >> f[i][1];
            f[i][2] = 1;
            f[i][3] = 0;
        }
    
        for (int i = n - 1; i >= 1; --i)
        {
            l = 0, k = 0;
            for (int j = i + 1; j <= n; ++j)
                if ((f[j][1] > f[i][1]) && (f[j][2] > l))
                {
                    l = f[j][2];
                    k = j;
                }
            if (l > 0)
            {
                f[i][2] = l + 1;
                f[i][3] = k;
            }
        }
    
        k = 1;
        for (int j = 1; j <= n; ++j)
            if (f[j][2] > f[k][2])
                k = j;
    
        cout << f[k][2] << endl;
        return 0;
    }
    
  • 相关阅读:
    盘子序列
    最大矩形面积
    【模板】ST表
    排队
    map循环遍历
    vue循环遍历给div添加id
    正则 匹配
    字符串拼接
    js对象追加到数组里
    二级标题左侧加粗线条
  • 原文地址:https://www.cnblogs.com/EdisonBa/p/14948696.html
Copyright © 2011-2022 走看看