動態規劃之LIS最長上升子列問題 java實現

題目如下 :

      在一個子串中任意取N項,要求這N項是遞增的,求出這個串中這樣的N的最大值,注意這樣的最長子列不一定是唯一的,例如在 2 1 5 3 6 4 6 3 中就有1 3 4 6 和2 3 4 6兩種,都是4。

   本題可以這麼考慮,可以從頭開始往後求,設置一個一維數dp組來保存以每一項爲結尾的最長子列數目,第一項的肯定是1,後面的第i項只要往前掃描,假如第j項值比我第i項的值小或者等於第i項,那麼以第i項爲結尾的最長子列數目就是max(dp[i],dp[j]+1),一直這麼求直到最後一項n,那麼整個串中最長上升子列數目就是dp[n]了,

所以代碼如下:

    

import java.util.*;
public class LIStest {
   public static void main(String[] args){
	   Scanner sc = new Scanner(System.in);
	   int n = sc.nextInt();
	   int[] datas = new int[n];
	   int[] max = new int[n];
	   int result = 0;
	   for(int i=0;i<n;i++){
		   datas[i] = sc.nextInt();
		   max[i] = 1;
	   }
	   for(int i=0;i<n;i++){
		   for(int j=0;j<i;j++){
			   if(datas[j]<=datas[i]){
				   max[i] = max(max[i],max[j]+1);
			   }
		   }
		   result = max(result,max[i]);
	   }
	   System.out.print(result);
   }
   public static int max(int a,int b){
	   if(a>b){
		   return a;
	   }else{
		   return b;
	   }
   }
}

結果如下 :

    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章