题目: 类似题目很多,换汤不换药 分析: 对于一组数据来说,每个元素都可能是上升子序列的尾元素,只需要知道该元素前面上升子序列长度+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;
}