o(nlogn) 做法直通车:http://blog.csdn.net/q547550831/article/details/51920052
动态规划——最长上升子序列问题(LIS)
最长上升子序列问题(LIS)。给定n个整数
A1,A2,…,AnA1,A2,…,An
,按从左到右的顺序选出尽量多的整数,组成一个上升子序列(子序列可以理解为:删除0个或多个数,其他数的顺序不变)。例如序列1, 6, 2, 3, 7, 5,可以选出上升子序列1, 2, 3, 5,也可以选出1, 6, 7,但前者更长。选出的上升子序列中相邻元素不能相等。
状态转移方程
dp[i]=max(dp[j]+1,dp[i]) 其中 0<=j<i ,&& a[j]<a[i]
dp[i] :前i 个数字 上升子序列的最长长度
a[i]:第i个字符
初始化
dp[i]=0 i from 0 to n-1 (i 也可能从 1开始 这个看自己的喜好)
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
int a[1002];
int dp[1002];
int n;
while(cin>>n&&n)
{
for(int i=0;i<n;i++)
{
cin>>a[i];
dp[i]=1;
}
int ans=0;
for(int i=1;i<n;i++)
{
for(int j=0;j<i;j++)
if(a[j]<a[i])
{
dp[i]=max(dp[j]+1,dp[i]);
}
ans=max(ans,dp[i]);
}
cout<<ans<<endl;
}
return 0;
}