1. 程式人生 > >最長遞增子序列程式設計之美232演算法

最長遞增子序列程式設計之美232演算法

#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;
}