最长有序子序列及其路径
来源:互联网 发布:海量数据股票目标价 编辑:程序博客网 时间:2024/06/07 15:34
#include<iostream> #include<string.h> #define N 8 using namespace std; int a[N] = {5, 1, 2, 6, 5, 6,2,1 }; //int a[10] = {6,5,4,2,9,1,5,12,3,2};int f[N];int l[N];//表示路径。int e = 0; int main() //找最长递减子序列。 { void printl(int); //用于打印路径 int i; memset(l,-1,sizeof(l)); //memset 只能初始化0 和-1. memset(f,0,sizeof(f)); f[0] = 1; int max = f[0]; for(i = 1; i<N; i++) { for(int j = 0; j<i; j++) if(a[i] < a[j] && f[i]<f[j])//a[j]<a[i]:递增子序列;a[j]<=a[i]不减子序列 { //a[j]>a[i]:递减子序列;a[j]>=a[i]不增子序列 f[i] = f[j]; l[i] = j; } f[i] ++; //将自身加上。 if(max<f[i]) { max = f[i]; e = i; //现在路径的end 位置。 } } // for(i = 0; i<N; i++) // cout<<l[i]<<" "; // cout<<endl; // cout<<l[e]; // cout<<e<<endl; cout<<max<<endl; printl(e); return 0; }void printl(int e){ if(l[e] != -1) printl(l[e]); cout<<a[e]<<" ";}