程序员面试金典(动态规划):叠罗汉问题_最长递增子序列(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]);
}
叠罗汉是一个著名的游戏,游戏中一个人要站在另一个人的肩膀上。同时我们应该让上面的人比下面的人更高一点。已知参加游戏的每个人的身高,请编写代码计算通过选择参与游戏的人,我们多能叠多少个人。注意这里的人都是先后到的,意味着参加游戏的人的先后顺序与原序列中的顺序应该一致。
给定一个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; } }
相关文章推荐
- 读程序员面试-java多线程1
- 关于fork()的一道经典面试题
- 面试后的总结
- 记第一次电面
- 读书笔记-《统计思维 程序员数学之概率统计》
- hibernate 面试题
- mybatis 面试题
- 初级码农,第一次做微信项目,幸好有老大带我飞!
- JAVA面试中问及HIBERNATE与 MYBATIS的对比,在这里做一下总结
- 迟来的first blood
- 【程序员基本功】字符集-编码、UNICODE-UTF的关系总结
- leetcode之Gas Station
- iOS面试题
- 说说高大上的职业规划 for “码农”
- 外国程序员整理的Java资料大全
- java面试题
- 职场经验
- 程序员:伤不起的三十岁
- 哪些老鸟程序员知道而新手不知道的小技巧?
- 8个方法让你成为更优秀的程序员