最长递增子系列(LIS)

来源:互联网 发布:天津软件培训 编辑:程序博客网 时间:2024/06/06 12:42

   最近遇到的,此代码来自《算法导论》

   具体代码如下:

#include <iostream>#include <fstream>using namespace std;#define INF -99999int 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;elsereturn 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中记录的并不是一个符合题意的最长上升子序列!

好好体会,不能理解的话,举个小例子来观察规律是个好方法!

0 0
原创粉丝点击