動態規劃求解編程
int calculate(int a[], int n) { int i; int maxV; //maxLen[i]表明截止到下標爲i(包括i)的最長子序列的長度 int * maxLen = (int *)malloc(n*sizeof(int)); for(i=0;i<n;i++) { maxLen[i]=1; for(int j = 0;j<i;j++) { if(a[i]>a[j] && maxLen[j]+1>maxLen[i]) { maxLen[i] = maxLen[j]+1; } } } maxV = max(maxLen,n); free(maxLen); return maxV; }
時間複雜的爲O(n*n)code
進一步分析class
若是前i-1個元素的任何一個遞增子序列的最大值小於第i個元素,那麼就能夠構成一個新的遞增子序列。重要的是咱們要保證新的遞增子序列儘量的長。書籍
int calculate(int a[],int n) { int i,j; //若是存在含有元素相同個數的多個子序列,長度爲i,將多個子序列的最大值中的最小值存入minV[i] int * maxV = (int *)malloc(sizeof(int) * (n+1)); //maxLen[i]表明截止到下標爲i(包括i)的最長子序列的長度 int * maxLen = (int *)malloc(sizeof(int) * n); //記錄最長子序列的長度,初始爲1 int max = 1; maxV[1] = a[0]; maxV[0] = min(a,n)-1; for(i=0;i<n;i++) { //初始化爲1 maxLen[i]=1; } for(i=1;i<n;i++) { for(j=max;j>=0;j--) { //若是當前值a[i]大於長度爲j的遞增子序列,則能夠構成長度爲j+1的遞增子序列。 if(a[i]>maxV[j]) { maxLen[i]=j+1; break; } } } //若是截止到下標爲i(包括i)的最長子序列的長度大於記錄max,則將max賦值爲maxLen[i] if(maxLen[i]>max) { max=maxLen[i]; //該長度爲maxLen[i]的子序列的最大值必定爲a[i] maxV[maxLen[i]]=a[i]; } else if(maxV[j] < a[i] && a[i] < maxV[j+1]) { maxV[j+1] = a[i]; } free(maxV); free(maxLen); return max; }
時間複雜度O(n*n)動態規劃
參考書籍:《編程之美》時間