程序员面试金典(动态规划):叠罗汉问题_最长递增子序列(java解法)

题目描述:


叠罗汉是一个著名的游戏,游戏中一个人要站在另一个人的肩膀上。同时我们应该让上面的人比下面的人更高一点。已知参加游戏的每个人的身高,请编写代码计算通过选择参与游戏的人,我们多能叠多少个人。注意这里的人都是先后到的,意味着参加游戏的人的先后顺序与原序列中的顺序应该一致。

给定一个int数组men,代表依次来的每个人的身高。同时给定总人数n,请返回做多能叠的人数。保证n小于等于500。


测试样例:
[1,6,2,5,3,4],6
返回:4

题目分析:

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为末元素的递增子序列。

这个算法由Java实现的代码如下:

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++)//循环

                {

                       if(L[j]<L[i]&&f[j]>f[i]-1)

                              f[i]=f[j]+1;//更新f[i]的值。

                }

         }

         System.out.println(f[n-1]);            

              }





import java.util.*;

public class Stack {
       public int getHeight(int[] men, int n) {
        // write code here
        int[] f=new int[n];
        int max=0; 
        f[0]=1;      
        for(int i=1;i<n;i++)
        {
            f[i]=1;    
            for(int j=0;j<i;j++){
                if(men[j]<=men[i]){
                    f[i]=Math.max(f[i],f[j]+1);                    
                }
            }            
            max=Math.max(max,f[i]);
        }        
        return max;
    }
}



你可能感兴趣的:(java,动态规划,程序员面试金典)