参考博客:
http://qiemengdao.iteye.com/blog/1660229
/* 最长递增子序列 LIS */
#include <iostream>
using namespace std;
#include <cstdio>
#include <cstdlib>
int main(){
int s[100], len[100], n;
// len[i] 表示到第i个元素为止,最长递增子序列的个数
while(scanf("%d",&n) != EOF){
for(int i = 0;i < n;i++){
scanf("%d",&s[i]);
len[i] = 1;
}/* dp思想 O(n*n) */
for(int i = 1;i < n;i++){
for(int j = i-1;j >= 0;j--){
if(s[i] > s[j] && len[i] < (len[j]+1))
len[i] = len[j] + 1;
}
}
int maxlen = 1;
for(int i = 0;i < n;i++){
cout << len[i] << " ";
if(len[i] > maxlen){
maxlen = len[i];
}
}
cout << endl;
cout << maxlen << endl;
}
system("pause");
}
#include <iostream>
using namespace std;
#include <cstdlib>
#include <cstdio>
/* LIS 可以转化成最长公共子序列问题 见:qiemengdao.iteye.com 详见解释 */
int find(int t[], int low, int high, int x){
while(low <= high){
int mid = low + (high - low)/2 ;
if(t[mid] == x)
return mid;
else if(t[mid] > x){
low = mid + 1;
}
else if(t[mid] < x){
high = mid - 1;
}
}
return low;
}
int main(){
/* LIS 问题 */
int s[100], end[100];
int n, k;
/* end[i] 表示当前递增子序列有i个¸以end[i]结尾,end[i](s[j]中的某个元素) */
/* dp 思想 */
while(scanf("%d",&n) != EOF){
for(int i = 0;i < n;i++){
scanf("%d",&s[i]);
}
end[0] = s[0];
k = 1;
for(int i = 1;i < n;i++){
if(s[i] >= end[k-1]){
end[k++] = s[i];
}
else{
int pos = find(end,0,k-1,s[i]);
end[pos] = s[i];
}
}
for(int i = 0;i < k;i++){
cout << end[i] << " ";
}
cout << endl;
cout << k << endl;
}
system("pause");
}
具体应用见: