• 动态规划练习 14


    题目:Bridging signals (POJ 1631)

    链接:http://acm.pku.edu.cn/JudgeOnline/problem?id=1631

    #include <iostream>
    #include <vector>
    #include <limits.h>
     
    using namespace std;
     
    // O(nlogn)
    int LIS(const vector<int> &data)
    {
        // if min_value[i] is j, means j is the min end value of all i length
        // increasing sequences.
        vector<int> min_value(data.size(), INT_MAX);
        int len = 1;
     
        for (size_t i = 0; i < data.size(); ++i)
        {   
            int left = 1, right = len;
     
            while (left <= right)
            {
                int mid = (left + right) / 2;
     
                if (data[i] > min_value[mid])
                {
                    left = mid + 1;
                }
                else
                {
                    right = mid - 1;
                }
            }
     
            // right = left - 1
            // min_value[right] < data[i], min_value[left] >= data[i]
            if (data[i] < min_value[left])
            {
                min_value[left] = data[i];
            }
     
            if (len < left)
            {
                len = left;
            }
        }
     
        return len;
    }
     
    int main(int argc, char **argv)
    {
        int cases, n;
        vector<int> data;
     
        cin >> cases;
        while (cases--)
        {
            cin >> n;
            while (n--)
            {
                int tmp;
                cin >> tmp;
                data.push_back(tmp);
            }
     
            cout << LIS(data) << endl;
            data.clear();
        }
     
        return 0;
    }
  • 相关阅读:
    ring0 ShadowSSDTHook
    ring0 恢复SSDTHook
    Go的CSP并发模型
    [转]An overview of Openvswitch implementation
    堆排序
    集群 分布式
    云介绍
    云分层
    happens-before
    Java异常
  • 原文地址:https://www.cnblogs.com/codingmylife/p/2635560.html
Copyright © 2020-2023  润新知