• 动态规划和二分查找的方式 求最大递增子序列


     1     public static int BiSearch(int[] A,int len,int w)
     2     {//二分查找,返回的是刚刚大于w的值的下标,这个值要被w替换掉。因为记录数组总是有序的,所以用二分查找很明智。
     3         int left=0;
     4         int right=len-1;//len是现在数组有几个元素的长度,而不是数组的长度。
     5         int middle=0;
     6         while(left<=right)
     7         {
     8             middle=(left+right)/2;
     9             if(A[middle]>w)
    10                 right=middle-1;
    11             else if(A[middle]<w)
    12                 left=middle+1;
    13             else 
    14                 return middle;
    15             
    16         }
    17         return ((A[middle]>w)?middle:middle+1);
    18     }
    19 public static int LIS(int [] A) 20 { 21 int [] B = new int[A.length];//B[]数组用来保存中间结果,记录长度为i的递增子序列中最大元素的最小值。 22 int i,pos=0; 23      i
    27 int len=1; 28 B[0]=A[0]; 29 for(i=1;i<A.length;i++) 30 {//从第二个元素开始,往后比较,判断这个元素是应该直接加到B后面呢,还是替换掉B里面的某个数 31 if(A[i]>B[len-1]) 32 {//如果A中数 A[i]大于B数组中的最后一个数字,直接将A[i]复制到B里,B的长度len加1 33 B[len]=A[i];
               
    34 ++len; 35 } 36 else 37 {//如果A[i]不大于B数组中的最后一个数字,找到B数组中,刚刚大于A[i]的数字的下标pos,将下标为pos的值替换为A[i](较小的数) 38 pos=BiSearch(B, len,A[i]); 39 B[pos]=A[i]; 40 } 41 } 42 return len;//len保存的即为最大递增子序列的长度。 43 44 }

    测试代码:

    1 public static void main(String[] args)
    2     {
    3         int array[] = {2, 1, 6, 3, 5, 4, 8, 7, 9};
    4         int [] res =LIS(array);
    5         for(int b:res)
    6             if(b!=0)
    7         System.out.print(b+" ");
    8         
    9     }
  • 相关阅读:
    调用Win32 API netapi32.dll 实现UNC(网络共享)连接的管理(一)
    一个重写Page基类的例子
    36进制进位算法例子
    关于.net 中调用script的alert后 css失效的办法
    Javascript:keyCode键码值表
    Url地址重写,利用HttpHander手工编译页面并按需生成静态HTML文件
    在.NET程序中正确使用String类型
    Sql Server中自动序号的方法
    托管和非托管的关系和区别
    Oracle 格式化
  • 原文地址:https://www.cnblogs.com/happinessqi/p/3554012.html
Copyright © 2020-2023  润新知