题目大意:给定一个序列,求该序列的最长上升子序列的长度。
思路:和1887一样,都是最长单调子序列的题目。尝试了两种做法,一个是和1887一样的做法,复杂度是O(n*n),还有一种是利用二分+栈,复杂度可优化为O(n*logn)。
#include <stdio.h>
int data[1010];
int dp[1010];
int main()
{
int i,j,n,m;
scanf("%d",&n);
for (i=0;i<n;i++) {
scanf("%d",&data[i]);
dp[i]=1;
}
m=1;
for (i=1;i<n;i++) {
for (j=0;j<i;j++) {
if (data[j]<data[i]&&dp[j]>=dp[i])
dp[i]=dp[j]+1;
}
if (dp[i]>m)
m=dp[i];
}
printf("%d\n",m);
return 0;
}
//最长单调子序列,二分加栈,只返回最长子序列的长度
#include <stdio.h>
int arr1[1010];
int arr2[1010];
int n,rear;
int solve(int t) {
int mid;
int l=1,r=rear;
while(l<=r) {
mid=(l+r)/2;
if(arr2[mid]>=t)
r=mid-1;
else
l=mid+1;
}
if(l>rear)
rear=l;
return l;
}
int main()
{
int i;
scanf("%d",&n);
rear=0;
for (i=1;i<=n;i++) {
scanf("%d",&arr1[i]);
arr2[solve(arr1[i])]=arr1[i];
}
printf("%d\n",rear);
return 0;
}