码迷,mamicode.com
首页 > 其他好文 > 详细

LIS

时间:2021-06-29 15:59:12      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:code   二分   ++   二分法   out   lis   初始化   max   tin   

二分

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

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;
}

LIS

标签:code   二分   ++   二分法   out   lis   初始化   max   tin   

原文地址:https://www.cnblogs.com/EdisonBa/p/14948696.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!