最近遇到的,此代码来自《算法导论》
具体代码如下:
#include <iostream>
#include <fstream>
using namespace std;
#define INF -99999
int find(int* arr, int len, int n){
int left = 0, right = len, mid = (left+right)/2;
while (left <= right){
if(n > arr[mid])
left = mid + 1;
else if(n < arr[mid])
right = mid - 1;
else
return mid;
mid = (left + right)/2;
}
return left;
}
int main(int argc, char* argv[])
{
ifstream m_cin("testLIS.txt");
int n, a[100], c[100], i, j, len;
while(m_cin >> n){
for(i = 0; i < n; i++){
m_cin >> a[i];
}
//这里把 c[0] 设为一个非常小的负数只是为了方便
//对数组下标的操作,属于一个小小技巧而已
c[0] = INF;
c[1] = a[0];
len = 1;
for(i = 1; i < n; i++){
j = find(c, len, a[i]);
c[j] = a[i];
if(j > len)
len = j;
}
cout << "最长递增子系列长度为:" << len << endl;
}
system("pause");
return 0;
}
值得注意的是,算法结束后数组c中记录的并不是一个符合题意的最长上升子序列!
好好体会,不能理解的话,举个小例子来观察规律是个好方法!