思路讲解
运用二分查找算法效率高:
我们设定一个
count[i]
数组来记录长度为i的子序列的在子序列最大的,但是在比其他大于前一个位置的大值小的最小右端数值。
举例:12754,那么我们的上升子序列可以为:{1,2,7},{1,2,5},{1,2,4}但是,要满足最小右端数值,所以4<5<7那么选择4作为在子序列中最右侧的最大的,同时也是比所有能够成为右侧最大值中最小的,那么我们用它来作为最小右端数值。
我们再用一个数组来存储当前我们这个元素作为终点(最小右端数值)的满足条件的子序列。
编写不易,如果友友们明白了,期盼给个三连!!!么么哒~~~
代码模糊位置讲解
#include<stdio.h>
#define MaxSize 1000
int A[MaxSize]={0};//用来存放数据
int f[MaxSize];//存放以A[i]为元素作为最小右端值的满足序列的长度
int Count[MaxSize]={0x3f3f3f};//表示满足长度为f[i]的不下降子序列的最小右端数值
int min(int x,int y)
{
return x>y?y:x;
}
int main(
{
int n;
f[1]=1;
Count[1]=A[1];
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&A[i]);
}
for(int i=1;i<n;i++)
{
for(int j=1;j<=n;j++)
{
if(Count[j]>A[i])
{
f[i]=j;
Count[f[i]]=min(Count[f[i]],A[i]);
}
}
}
for(int i=i;i<=n;i++)
{
printf("%d",f[i]);
}
return 0;
}