#include<stdio.h>
int a[]={13, 15, 12, 28, 17, 33, 2, 29, 34, 30};
int b[20];//存放以a[i](0<=i<=a.length-1)为最后元素的最大递增子串的长度。
int num = 10;//num为a数组的长度
int k;//存放最大递增子串最后一个元素的下标
//求出b[i]中最大的值(即是最大递增子串的长度),并将其下标存在k中
int Max() {
int temp = 0;
for (int i = 0; i < num; i++) {
if (b[i] > temp) {
temp = b[i];
k = i;
}
}
return temp;
}
// 以a[i](0<=i<=a.length-1)为最后元素的最大递增子串的长度存到b[i]中
int Lis() {
b[0] = 1;//以a[0]为最后元素的子串只有a[0],所以长度为1.
int k;
for (int i = 1; i < num; i++) {
k = 0;
for (int j = 0; j < i; j++) {
if (a[j] <= a[i] && k < b[j]) {
//比较所有小于a[i]并位于a[i]前面的最大子串的长度。比如3 6 4 5,那么以5结尾的最大子串长度
//等于:max{(小于5的元素有3,4)3的最大子串长度,4的最大子串长度}+1;
k = b[j];
}
}
b[i] = k + 1;//max{(小于5的元素有3,4)3的最大子串长度,4的最大子串长度}+1;
}
return Max();
}
//从大到小输出递增子串
void print(int index){
printf("%d ",a[index]);
for (int i = 0; i < index; i++) {
if (b[i] == b[index] - 1 && a[i] <= a[index]) {
print(i);
break;
}
}
}
void main(){
printf("最大递增子串的长度为:%d\n",Lis());
printf("最大递增子串从大到小输出为:\n");
print(k);
}
[
本帖最后由 linjx0123 于 2010-7-27 17:42 编辑 ]