题目描述
假设书本的叠放有这样的规则,当A书的长度和宽度都大于B书时,可以将其B书置于A的上方,堆叠摆放,请设计一个程序,根据输入的书本长宽,计算最多可以堆叠摆放多少本书?
输入
[[16,15], [13, 12], [15, 14]]
输出
3
说明
这里代表有3本书,第1本长宽分别为16和15,第2本长宽为13和12,第3本长宽为15和14,它们可以按照[13, 12],[15, 14],[16,15]的顺序堆叠,所以输出3
【分析】
动态规划,实质是求最长递增子序列,但本题有两个因素需要考虑,可以通过排序将长度置为有序,这样其实就是对宽度求最长递增子序列,且可能存在长度相同的情况,在更新dp数组判定时,也要考虑到
【实现】
// 获取输入
const input = "[[16,15], [16, 14], [13, 12], [15, 14]]"
// 转为数组
const arr = JSON.parse(input)
const len = arr.length
// dp数组 dp[i]表示前i本书的最长子序列长度
// 默认为1即每个序列本身就是一个子序列,长度为1
const dp = new Array(len).fill(1)
// 对输入的数组按照长度、宽度的大小进行排序
arr.sort((a, b) => {
if (a[0] !== b[0]) {
return a[0] - b[0]
} else {
return a[1] - b[1]
}
})
// 结果,初始为1,即至少可以放一本书
let res = 1
// 从第2本书向前找,看看加上它能不能增加长度
for (let i = 1; i < len; i++) {
// 要新加的书的长度和宽度
const cur = arr[i]
for (let j = 0; j < i; j++) {
// 要比较的书的长度和宽度
const pre = arr[j]
if (cur[0] > pre[0] && cur[1] > pre[1]) {
// 新加的书的长宽均大于当前书,说明这本书可以加在当前书的递增序列之后
// 判断此时的递增子序列最大值
dp[i] = Math.max(dp[i], dp[j] + 1)
}
// 更新最大值结果
res = Math.max(res, dp[i])
}
}
console.log(res);
题目一[周期串问题] 如果一个字符串可以由某个长度为k的字符串重复多次得到,我们说该串以k为周期。例如,abcabcabcabc以3为周期(注意,它也可以6和12为周期,结果取最小周期3)。字符串的长度小于等于100,由调用者保证。 接口说明 原型: int GetMinPeriod(char *inputstring); 输入参数: char * inputstring:字符串 返回值: int...
题目 描述: 题目标题:铁路栈问题 铁路的调度站如下: 火车编号为:1~9,且不重复。 如:编号分别为“1”、“2”、“3”、“4”、“5”的5个火车顺序进站,那么进站序列为“12345”,全部进站后再顺序出站,则出站序列为“54321&rdq...
题目一[周期串问题] 假设一个字符串能够由某个长度为k的字符串反复多次得到,我们说该串以k为周期。比如,abcabcabcabc以3为周期(注意,它也能够6和12为周期,结果取最小周期3)。 字符串的长度小于等于100,由调用者保证。 接口说明 原型: int GetMinPeriod(char *inputstring); 输入參数: char * inputstring:字符串 返回值: in...
笔试练习–华为 1.有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板。如果小张手上有n...
题目 描述: 输入: 输出: 例如: 练习阶段: 代码 <script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering =...
题目 描述: 题目描述 接口说明 原型: 输入参数: 返回值: 练习阶段: 初级 代码 <script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; ...
题目 函数原型: 练习阶段: 代码 <script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul...
题目 接口说明 原型: 输入参数: 输出参数: 返回值: 练习阶段: 初级 代码 <script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var...
题目 描述: 题目类别: 难度: 运行时间限制: 内存限制: 阶段: 输入: 输出: 样例输入: 样例输出: 代码 <script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split(...
题目 代码 <script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addC...