寻找最长增长子序列的另一种方法

时间:2017-02-07 19:45:29

标签: c++ algorithm recursion dynamic-programming subsequence

我知道有很多算法可以找到最长的增加子序列,但使用DP的算法都很常见 - 它们在数组的特定元素处递归/动态计算最长的子序列“ENDING”。

我写了一个解决方案,它在特定的数组中使用最长的子序列“启动”,这似乎也可以正常工作。

#include<iostream>
using namespace std;
#define boostio ios_base::sync_with_stdio(0);

int n;
int a[100000];
int t[100000] = {-1};

int lis(int i){

    if(t[i]!= -1){
        return t[i];
    }   

    if(i == n){t[i] = 1; return 1;
    }

    for (int x = i+1; x <= n ; ++x)
    {
        if(a[x] > a[i] and 1 + lis(x) > t[i]){
            t[i] = 1 + lis(x);
            //return t[i];
        }


    }

    if(t[i] != -1){
            return t[i];
        }

    t[i] = 1; return 1;



}
int main(){
    boostio;
    cin >> n;

    for (int i = 1; i <= n; ++i)
    {
        cin >> a[i];
    }

    fill(t, t + n+2 ,-1);

    Int m = 0;

    for (int i = 1; i <= n; ++i)
    {
        //cout << i << " " << lis(i) << endl;
        if(lis(i) >m) m= lis(i);
    }

    cout << m;

    return 0;
}

我想知道,这是否比我们对子序列的“最后一个元素”而不是第一个元素进行递归更糟糕。它们对我来说似乎都是n阶算法,所以为什么这个算法不再流传。对我而言似乎更直观。我错过了什么吗?

0 个答案:

没有答案