pku 2533 Longest Ordered Subsequence 最长递增字串
方法一 利用low-bound函数
lower_bound()函数需要加载头文件#include<algorithm>,其基本用途是查找有序区间中第一个大于或等于某给定值的元素的位置
#include <iostream>
#include <algorithm>
#define INF 999999
using namespace std;
int ary[1005],dp[1005];
void solve(int a)
{
for(int i=0;i<a;i++) dp[i]=INF;
for(int i=0;i<a;i++)
{
*lower_bound(dp,dp+a,ary[i])=ary[i];
}
cout<<lower_bound(dp,dp+a,INF)-dp<<endl;
}
int main()
{
int a;
cin>>a;
for(int i=0;i<a;i++)
{
cin>>ary[i];
}
solve(a);
return 0;
}
方法二 dp
dp[i] 表示在从ary[0]到ary[i]的最长递增子串
首先 dp[i]一开始肯定为1 表示ary[i]自己
随后从0到i开始遍历 找到某一个递增字串dp[j] 并追加上ary[i]自己. 找到最大值
#include <iostream>
#include <algorithm>
#define INF 999999
using namespace std;
int ary[1005],dp[1005];
void solve(int a)
{
int res=0;
for(int i=0;i<a;i++)
{
dp[i]=1;
for(int j=0;j<i;j++)
{
if(ary[j]<ary[i]) dp[i]=max(dp[i],dp[j]+1);
}
res=max(res,dp[i]);
}
cout<<res<<endl;
}
int main()
{
int a;
cin>>a;
for(int i=0;i<a;i++)
{
cin>>ary[i];
}
solve(a);
return 0;
}