首先我们看一下问题,
马戏团正在设计一种塔式表演,由人们站在彼此的塔顶上组成
肩膀。出于实用和美观的原因,每个人都必须比他或她下面的人矮且轻。给定马戏团中每个人的身高和体重,编写一个方法来计算最大可能的人数
在这样的一座塔里。
EXAMPLE:
Input:
(ht, wt): (65, 100) (70, 150) (56, 90) (75, 190) (60, 95) (68, 110)
Output: The longest tower is length 6 and includes from top to bottom:
(56, 90) (60,95) (65,100) (68,110) (70,150) (75,190)
但我不太明白解决方案如下:
书中建议的解决方案:
- 步骤 1. 按高度对所有物品进行排序
首先,然后按重量。这意味着
如果所有的高度都是唯一的,
那么项目将按以下顺序排序
他们的身高。如果高度是
同样,项目将按其排序
重量。示例:»»排序之前:
(60, 100) (70, 150) (56, 90) (75,
190) (60, 95) (68,110)。 “后
排序:(56, 90), (60, 95),
(60,100), (68, 110), (70,150),
(75,190)。
步骤 2. 找到最长序列
其中包含不断增加的高度和
增加重量。为此,我们:
a) 从开头开始
顺序。目前,max_sequence 是
空的。
-
b) 如果对于下一个项目,
身高和体重不大于
与前一项相比,我们
将此项目标记为“不适合”
c) 如果
找到的序列的项目数多于
“最大序列”,它变成“最大
顺序”。
-
d) 之后搜索是
重复“不合适的项目”,
直到我们到达终点
原始序列。
public class Question {
ArrayList<HtWt> items;
ArrayList<HtWt> lastFoundSeq;
ArrayList<HtWt> maxSeq;
/ Returns longer sequence
ArrayList<HtWt> seqWithMaxLength(ArrayList<HtWt> seq1, ArrayList<HtWt> seq2) {
return seq1.size() > seq2.size() ? seq1 : seq2;
}
// Fills next seq w decreased wts&returns index of 1st unfit item.
int fillNextSeq(int startFrom, ArrayList<HtWt> seq) {
int firstUnfitItem = startFrom;
if (startFrom < items.size()) {
for (int i = 0; i < items.size(); i++) {
HtWt item = items.get(i);
if (i == 0 || items.get(i-1).isBefore(item)) {
seq.add(item);
} else {
firstUnfitItem = i;
}
}
}
return firstUnfitItem;
}
// Find the maximum length sequence
void findMaxSeq() {
Collections.sort(items);
int currentUnfit = 0;
while (currentUnfit < items.size()) {
ArrayList<HtWt> nextSeq = new ArrayList<HtWt>();
int nextUnfit = fillNextSeq(currentUnfit, nextSeq);
maxSeq = seqWithMaxLength(maxSeq, nextSeq);
if (nextUnfit == currentUnfit)
break;
else
currentUnfit = nextUnfit;
}
}
}
问题,
1> fillNextSeq函数的用法是什么?
2> 为什么检查“items.get(i-1).isBefore(item)”而不是将当前项目与seq中的最新项目进行比较?
假设排序列表为(1, 5), (2, 1), (2, 2),基于fillNextSeq的函数,
第一个 (1, 5) 将被推入序列中。那么项目 (2, 1) 不会被推入序列 b/c (2,1) 的权重小于 (1, 5)。接下来,由于 (2, 1) 在 (2, 2) 之前,因此 (2, 2) 将被推入序列中。
现在,序列包含 (1, 5) 和 (2, 2),这是不正确的,因为 (1, 5) 的权重大于 (2, 2) 的权重。
谢谢