zoukankan      html  css  js  c++  java
  • 【转】动态规划:最长递增子序列Longest Increasing Subsequence

    转自:https://www.cnblogs.com/coffy/p/5878915.html

    设f(i)表示L中以ai为末元素的最长递增子序列的长度。则有如下的递推方程:

    这个递推方程的意思是,在求以ai为末元素的最长递增子序列时,找到所有序号在L前面且小于ai的元素aj,即j<i且aj<ai。如果这样的元素存在,那么对所有aj,都有一个以aj为末元素的最长递增子序列,设其长度为f(j),把其中最大的f(j)选出来,那么f(i)就等于最大的f(j)加上1,即以ai为末元素的最长递增子序列,等于以使f(j)最大的那个aj为末元素的递增子序列,再加上ai;如果这样的元素不存在,那么ai自身构成一个长度为1的以ai为末元素的递增子序列。

    public void lis(float[] L)
      {
             int n = L.length;
             int[] f = new int[n];//用于存放f(i)值;
             f[0]=1;//以第a1为末元素的最长递增子序列长度为1;
             for(int i = 1;i<n;i++)//循环n-1次
             {
                    f[i]=1;//f[i]的最小值为1;
                    for(int j=0;j<i;j++)//循环i 次
                    {
                           if(L[j]<L[i]&&f[j]+1>f[i])//f[j]+1>f[i]意思是以j结尾的递增序列加上元素i之后,整个递增序列变得更长了
                                  f[i]=f[j]+1;//更新f[i]的值。//
                    }
             }
            //f[i]的值是以L[i]为结尾的递增子序列的长度,需要求LIS,所以要取其中的最大值。
            return max(f);            
      }
  • 相关阅读:
    SDSF output to PS
    3亿人出走后的中国农村,路在何方?
    oracle function
    C8051特点
    c8051单片机注意事项:
    一个因xdata声明引起的隐含错误
    宏 函数 内联函数inline
    字符串与液晶显示的一个问题
    XON/OFF
    excel之实验数据处理线性拟合
  • 原文地址:https://www.cnblogs.com/aaronhoo/p/11436845.html
Copyright © 2011-2022 走看看