#define N 10 int lis[N+1][N+1]; int *LIS(int *a) { for (int i=1; i<=N; i++) { lis[i][0]=1; lis[i][1]=a[i]; for (int j=1;j<i; j++) { if (a[i]>lis[j][lis[j][0]]) { lis[j][0]++; lis[j][lis[j][0]] = a[i]; } } } int max=0; int k; for (int i=1; i<=N; i++) { if (lis[i][0]>max) { max = lis[i][0]; k = i; } } for (int i=1; i<=lis[k][0]; i++) cout << lis[k][i] << " "; cout << endl; return &(lis[k][0]); }
时间复杂度,空间复杂度都是O(N^2)
方法二:
int lis[N]; void printAnswer(int *a, int *lis) { int max = 0; for (int i=0; i<N; i++) { if (max < lis[i]) max = lis[i]; } for (int i=N-1; i>=0 && max; i--) { if (lis[i]==max) { cout << a[i] << " "; max--; } } cout << endl; } void LIS(int *a) { for (int i=0; i<N; i++) { lis[i]=1; for (int j=0; j<i; j++) { if (a[i]>a[j] && lis[j]+1>lis[i]) { lis[i] = lis[j]+1; } } } for (int i=0; i<N; i++) { cout << lis[i] << " "; } cout << endl; printAnswer(a, lis); }
时间复杂度O(N^2) 空间复杂度O(N)
递归,动态规划:
int LIS(int *a, int i) { int max=1; int t; for (int k=0; k<i; k++) { if (lis[k]) t = lis[k]; else t=lis[k]=LIS(a, k); if (a[i]>a[k] && t+1 > max) max = t+1; } return max; }