题目: 类似题目很多,换汤不换药 分析: 对于一组数据来说,每个元素都可能是上升子序列的尾元素,只需要知道该元素前面上升子序列长度+1就ok了 以(1,7,3,5,9,4,8)来说: f[0]=1,f[1]=2,f[2]=2,f[3]=3,f[4]=4,f[5]=3,f[6]=4; 最长上升子序列长度
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int n;
while(cin>>n)
{
vector<int> v(n);
for(int i=0;i<n;i++)
cin>>v[i];
vector<int> temp(n,1);
int maxNum=1;
for(int i=1;i<n;i++)//以v[i]为结尾元素时
{
for(int j=0;j<i;j++)
{
if(v[j]<v[i])
temp[i]=max(temp[i],temp[j]+1);
}
maxNum=max(temp[i],maxNum);//判断哪个结尾元素所出现的升序子序列最长
}
cout<<maxNum<<endl;
}
return 0;
}
最长上升子序列--序列
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int n;
while (cin >> n)
{
vector<int> v(n);
for (int i = 0; i<n; i++)
cin >> v[i];
vector<int> temp(n, 1);
for (int i = 1; i<n; i++)//以v[i]为结尾元素时
{
for (int j = 0; j<i; j++)
{
if (v[j]<v[i])
temp[i] = max(temp[i], temp[j] + 1);
}
}
int maxNum = 0;
int index;//最长子序列尾元素对应的下标值
for (int i = 0; i < temp.size(); i++)
{
if (temp[i]>maxNum)//判断哪个结尾元素所出现的升序子序列最长
{
maxNum = temp[i];
index = i;
}
}
cout << maxNum << endl;//序列长度
vector<int> data(maxNum+1,0);//保存序列元素
for (int i = 1; i <= maxNum; i++)
{
// j<=index防止data[i]中元素越过尾元素下标
//防止1,2,5,6,3,4这样的序列出错
for (int j = i-1; j <= index; j++)
{
if (i == temp[j])
data[i] = v[j];// temp数组中相同的元素,最后一个,肯定是最长上升子序列中的元素
}
}
for (int i = 1; i <= maxNum; i++)
cout << data[i] << " ";
cout << endl;
}
return 0;
}