目录
1.分析
状态:F(n)表示以第n个数结尾的一个最长上升子序列。
初始状态:F(1)=1;
状态转移方程:
以arr[]表示输入的数组,当arr以第n个数结尾比前n-1其中一个(s)末尾数大时,F(n)=F(s)+1;
只需要从头遍历,取出最长的那个F(s)+1即可。
F(n)=max(F(s)+1);
2.代码
#include <iostream>
#include<vector>
using namespace std;
int main()
{
int n;
while(cin>>n)
{
vector<int> v;
v.resize(n+1);
v[1]=1;
vector<int> arr;
arr.resize(n);
for(int i=0;i<n;i++)
cin>>arr[i];
for(int i=2;i<=n;i++)
{
int max=1;
for(int j=1;j<i;j++)
{
if(arr[i-1] > arr[j-1])
{
if(max < v[j]+1)
max=v[j]+1; //遍历找到最长的
}
}
v[i]=max; //将最长的序列赋值保存
}
int result=0;
for(int i=1;i<=n;i++) //取出v[]中最大的那个数,即是最终结果。
{
if(result < v[i])
result=v[i];
}
cout<<result<<endl;
}
return 0;
}