思路是
i=0 len[0]=1;
对于i>0结尾的数字,最大长度为前面小于等于data[i]并且长度长度去最大长度的元素的长度+1
用res[]保存父节点的下标
最后通过一次变量找到最大长度
#include<iostream>
#include<vector>
using namespace std;
bool getData(vector<int> &data,vector<int> &res,vector<int> &len)
{
for (int i = 0; i < data.size(); i++)
{
len[i] = 0;
}
len[0] = 1;
res.push_back(-1);
for (int i = 1; i < data.size(); i++)
{
int ans = 0;
int dex = 0;
for (int j = 0; j < i; j++)
{
if (data[i] >= data[j]&&ans <= len[j])
{
ans = len[j];
dex = j;
}
}
len[i] = ans + 1;
res.push_back(dex);
}
return 0;
}
void print(vector<int>&data,vector<int> &res,int i)
{
if (res[i] == -1)
cout << endl;
else
{
print(data,res,res[i]);
cout << data[res[i]] << " ";
}
}
int main()
{
vector<int> data = {1,2,34,5,3,34,2,3,43,6};
vector<int> res;
vector<int> len (data.size()+1,1);
//cout << len.size();
getData(data,res,len);
for (int i = 0; i < data.size(); i++)
{
cout << "长度:"<<len[i]<<endl;
print(data,res,i);
cout << data[i] << endl;
}
int max = 0;
for (int i = 0; i < data.size(); i++)
if (max < len[i])
max = len[i];
cout << "最大长度为" <<max<< endl;
system("pause");
}