zoukankan      html  css  js  c++  java
  • POJ2533 Longest Ordered Subsequence

    http://poj.org/problem?id=2533

    该题是最裸的LIS题,这里有两种方法。

    代码如下:

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;

    int a[10000], dp[10004];

    int main()
    {
    int N;
    while (scanf("%d", &N) == 1)
    {
    int ans = 1, m;
    for (int i = 0; i < N; ++i)
    {
    scanf("%d", a+i);
    }
    dp[0] = 1;
    for (int i = 1; i < N; ++i)
    {
    m = 0;
    for (int j = 0; j < i; ++j)
    {
    if (a[i] > a[j] && dp[j] > m)
    {
    m = dp[j];
    }
    }
    dp[i] = m+1;
    ans = max(ans, dp[i]);
    }
    printf("%d\n", ans);
    }

    }

    二分优化后的写法,数组c[i]保留长度为i的上升串的末尾最小元素。

    代码如下:

    #include <cstdlib>
    #include <cstring>
    #include <cstdio>
    #define MAXN 10000
    using namespace std;

    int a[MAXN+5];

    int bsearch(int *c, int l, int r, int val)
    {
    int mid;
    while (l <= r)
    {
    mid = (l+r)>>1;
    if (val > c[mid])
    l = mid + 1;
    else if (val < c[mid])
    r = mid - 1;
    else // 如果不是严格的递增序列的话,二分查找时,相等视为后者比其大
    return mid;
    }
    return l;
    }

    int LIS(int *a, int N)
    {
    int c[MAXN], size = 1, pos;
    c[1] = a[0];
    for (int i = 1; i < N; ++i)
    {
    if (a[i]>c[size])
    pos = ++size;
    else
    pos = bsearch(c, 1, size, a[i]);
    // 返回比该值稍微大的点
    c[pos] = a[i];
    }
    return size;
    }

    int main()
    {
    int N;
    while (scanf("%d", &N) == 1)
    {
    for (int i = 0; i < N; ++i)
    {
    scanf("%d", &a[i]);
    }
    printf("%d\n", LIS(a, N));
    }
    }




  • 相关阅读:
    封装缓动动画函数
    封装动画函数-匀速运动
    实现产品图片的放大镜效果:
    仿淘宝侧边栏滚动案例:
    页面被卷去的头部兼容性解决方案
    简单发送短信倒计时案例
    Echarts 版本的那些坑
    json变量作键名
    媒体查询那些事儿
    mac 强制关闭指定端口
  • 原文地址:https://www.cnblogs.com/Lyush/p/2378430.html
Copyright © 2011-2022 走看看