posts - 195, comments - 34, trackbacks - 0, articles - 1

          LongestIncrementSubarray

          Posted on 2009-10-26 11:39 小強摩羯座 閱讀(181) 評論(0)  編輯  收藏 所屬分類: 算法編程
          package com.dwq.algo;

          import java.util.ArrayList;

          public class LongestIncrementSubarray
          {

              
          public static void main(String[] args)
              
          {
                  
          int[] a = 3-124,35-86 };

                  
          int len = LIS2(a);
                  System.out.println(len);
                  
          for (int i : re)
                      System.out.print(i 
          + "");
              }


              
          static ArrayList<Integer> re = new ArrayList<Integer>();

              
          static int LIS(int[] a)
              
          {
                  
          int[] lis = new int[a.length];
                  
          int maxL = -1;
                  
          int max = 0;
                  
          for (int i = 0; i < a.length; i++)
                  
          {
                      lis[i] 
          = 1;
                      
          for (int j = 0; j < i; j++)
                      
          {
                          
          if (a[j] < a[i] && lis[j] + 1 > lis[i])
                          
          {
                              lis[i] 
          = lis[j] + 1;
                              
          if (lis[i] > maxL)
                              
          {
                                  maxL 
          = lis[i];
                                  max 
          = a[i];
                                  re.add(a[j]);
                              }

                          }

                      }

                  }

                  re.add(max);
                  
          return maxL;
              }


              
          static int LIS2(int[] a)
              
          {
                  
          int[] maxV = new int[a.length + 1];
                  maxV[
          0= Integer.MIN_VALUE;
                  maxV[
          1= a[0];

                  
          int lis[] = new int[a.length];
                  
          for (int i = 0; i < lis.length; i++)
                      lis[i] 
          = 1;
                  
          int maxLIS = 1;
                  
          for (int i = 1; i < a.length; i++)
                  
          {
                      
          int j;
                      
          for (j = maxLIS; j > 0; j--)
                      
          {
                          
          if (a[i] > maxV[j])
                          
          {
                              lis[i] 
          = j + 1
                              
          break;
                          }

                      }

                      
          if (lis[i] > maxLIS)
                      
          {
                          maxLIS 
          = lis[i];
                          maxV[lis[i]] 
          = a[i];
                      }
           else //前面有a[i] > maxV[j]了已經
                      if (a[i] > maxV[j] && a[i] < maxV[j + 1])//后面的有選小的
                          maxV[j + 1= a[i];
                  }

                  
          return maxLIS;
              }

              
          static int LIS3(int[] a)
              
          {
                  
          int[] maxV = new int[a.length + 1];
                  maxV[
          0= Integer.MIN_VALUE;
                  maxV[
          1= a[0];

                  
          int lis[] = new int[a.length];
                  
          for (int i = 0; i < lis.length; i++)
                      lis[i] 
          = 1;
                  
          int maxLIS = 1;
                  
          for (int i = 1; i < a.length; i++)
                  
          {
                      
          int j;
                      
          for (j = maxLIS; j > 0; j--)
                      
          {
                          
          if (a[i] > maxV[j])
                          
          {
                              lis[i] 
          = j + 1
                              
          break;
                          }

                      }

                      
          if (lis[i] > maxLIS)
                      
          {
                          maxLIS 
          = lis[i];
                          maxV[lis[i]] 
          = a[i];
                      }
          // else //前面有a[i] > maxV[j]了已經
                  
          //    if (a[i] > maxV[j] && 
                      if(a[i] < maxV[j + 1])//a[i],對應到maxV[j+1]位置上,并選小的
                          maxV[j + 1= a[i];
                  }

                  
          return maxLIS;
              }

          }



          主站蜘蛛池模板: 扶余县| 淮阳县| 三亚市| 内丘县| 平南县| 神池县| 毕节市| 天水市| 鄢陵县| 永兴县| 罗江县| 蒲江县| 德阳市| 浠水县| 东阳市| 额尔古纳市| 临城县| 巴青县| 桦川县| 渭南市| 怀集县| 晋城| 澎湖县| 孟津县| 南开区| 高州市| 彭州市| 正蓝旗| 瑞昌市| 灵台县| 南和县| 河东区| 永春县| 遂溪县| 双峰县| 新余市| 建瓯市| 延寿县| 武安市| 镶黄旗| 夹江县|