编程之美 2.16 求数组中最长递增子序列

解题思路:设数组为1,-1,2,-3,4,-5,6,-7

从后向前迭代:-7首先直接放入临时数组(-7,1),1代表长度为1;

                      6,比-7大,所以不能和-7组合为递增序列,同时6肯定优于-7,所以置换为(6,1);

                      -5比6小,可以和6组合为递增序列,(-5,2),(6,1);

        4比6小,可以和6组合为递增序列,同时,4比-5大,所以置换为(4,2),(6,1);

        -3比6小,可以组合,同时,-3比4小,也可组合,添加,(-3,3),(4,2),(6,1);

          2比6小,可以组合,2比4小,也可组合,2比-3大,置换(2,3),(4,2),(6,1);

          -1比它们都小,可以添加,(-1,4),(2,3),(4,2),(6,1);

       1比6,4,2小,比-1大,置换,(1,4),(2,3),(4,2),(6,1);

            结束。

最终得出最长的长度即为4.在这个过程中,需要用一个变长数组来维护前面计算的结果。

#include<iostream>
#include<vector>
using namespace std;

int LIS(int *arr, int N){
    vector<int> vec;
    vec.push_back(arr[N-1]);
    for (int i = N - 2; i >= 0; --i){
        int len = vec.size();
        for (int j = 0; j < len; ++j){
            if (arr[i] > vec[j]){
                vec[j] = arr[i];
            }
            else{
                if (j + 1 > len - 1)
                    vec.push_back(arr[i]);
                else
                    if (arr[i] > vec[j+1]){
                        vec[++j] = arr[i];
                    }
            }
        }
    }
    return vec.size();
}

int main(){
    int N;
    cin >> N;
    int arr[100];
    for (int i = 0; i < N; ++i)
        cin >> arr[i];
    cout << LIS(arr, N) << endl;
    return 1;
}

 

posted on 2012-12-27 15:49  小龙人2012  阅读(309)  评论(0编辑  收藏  举报

导航