最長遞增子序列程式設計之美232演算法
阿新 • • 發佈:2019-01-31
#include <stdio.h> #include <stdlib.h> int a[100];//儲存原始序列 int LIS[100];//儲存以a[i]為最大元素的最長遞增子序列的長度 int MaxV[100];//儲存長度為i的遞增子序列最大元素的最小值 int N;//儲存原始序列的長度 int Min(int b[]){ int i; int temp=b[0]; for(i=0;i<N;i++){ if(b[i]<temp) temp=b[i]; } // printf("最小值是%d",temp); return temp; } int Max(int b[]){ int i; int temp=b[0]; for(i=0;i<N;i++){ if(b[i]>temp) temp=b[i]; } // printf("最大值是%d",temp); return temp; } int MaxLIS(){ int i,j; MaxV[1]=a[0];//陣列中的第一個值設為長度為1的遞增序列的最小值 MaxV[0]=Min(a)-1;//陣列a最小值 作為邊界 // 初始化最長遞增序列的資訊 for(i=0;i<N;i++) LIS[i]=1; int nMaxLIS=1;//陣列最長的遞增子序列的長度 for(i=1;i<N;i++){ for(j=nMaxLIS;j>=0;j--){ if(a[i]>MaxV[j]){ //若a[i]大於長度為j的子序列的的中最小的那個最大值(子序列最後一個值),則第i個元素為結尾的子序列的長度為j+1 LIS[i]=j+1; break;//找到最大的MaxV[j]符合條件時退出迴圈 } } //如果當前最長序列大於最長遞增序列的長度,更新最長資訊 if(LIS[i]>nMaxLIS){ nMaxLIS=LIS[i]; MaxV[LIS[i]]=a[i];//長度為LIS[i]的子序列的最大元素的最小值為a[i] } else if(MaxV[j]<a[i]&&a[i]<MaxV[j+1]){ MaxV[j+1]=a[i]; } } return Max(LIS); } int main(int argc, char *argv[]) { int i=0; int MaxRes=0; printf("輸入N\n"); scanf("%d",&N); for(i=0;i<N;i++) scanf("%d",&a[i]); MaxRes=MaxLIS(); printf("最長遞增子序列的長度是%d",MaxRes); system("PAUSE"); return 0; }