大概的算法是贪心+二分。将第一个元素放入b[1],然后每读入一个数num,如果num大于(看题目确定是否要等于)数组里的最后一个数,则加入b中。否则,用二分查找的方法找到一个位置,使得num>b[i-1] 并且num<b[i],并用num代替b[i]。 如该数列为: 5 9 4 1 3 7 6 7 那么: 5 //加入 5 9 //加入 4 9 //用4代替了5 1 9 //用1代替4 1 3 //用3代替9 1 3 7 //加入 1 3 6 //用6代替7 1 3 6 7 //加入 最后b中元素的个数就是最长递增子序列的大小,即4。 要注意的是最后数组里的元素并不就一定是所求的序列, 例如如果输入 2 5 1 那么最后得到的栈应该是 1 5 而实际上要求的序列是 2 5 更详细还带研究。。 #include<iostream> using namespace std; const int Max=29001; int a[Max],b[Max]; int n; int binary(int num,int k) { int low=1,high=k; while(low<=high) { int mid=(low+high)/2; if(num>=b[mid])//别忘了= low=mid+1; else high=mid-1; } return low; } int LIS() { int i,k=1; b[1]=a[0]; for(i=1;i<n;i++) { if(a[i]>=b[k]) b[++k]=a[i]; else { int pos=binary(a[i],k); b[pos]=a[i]; } } return k; } int main() { while(scanf("%d",&n)!=EOF) { int i; for(i=0;i<n;i++) scanf("%d",&a[i]); int ans=LIS(); printf("%d/n",ans); } return 0; }