这道题还有优化的解法:保留一个动态规划优化矩阵,里面保留每次最长子序列的终点。
#include<iostream>
#include<vector>
using namespace std;
int Max(int *a, int n)
{
int max = a[0];
for(int i = 1; i < n; i++)
if(max < a[i])
max = a[i];
return max;
}
int LIS(vector<int> &array)
{
int *a = new int[array.size()];
for(int i = 0; i < array.size(); i++)
{
a[i] = 1; //初始化默认的长度
for(int j = 0; j < i; j++) //前面最长的序列
{
if(array [i] > array [j] && a[j] + 1 > a[i])
{
a[i] = a[j] + 1;
}
}
}
return Max(a, array.size());
}
int main(void)
{
vector<int>vec;
vec.push_back(1);
vec.push_back(-1);
vec.push_back(2);
vec.push_back(-3);
vec.push_back(4);
vec.push_back(-5);
vec.push_back(6);
vec.push_back(-7);
int max=LIS(vec);
cout<<max<<endl;
}