您的位置:首页 > 职场人生

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

2016-03-10 20:38 162 查看
题目描述:

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

给定一个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
;//用于存放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]>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
;
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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: