[编程题] 马戏团
搜狐员工小王最近利用假期在外地旅游,在某个小镇碰到一个马戏团表演,精彩的表演结束后发现团长正和大伙在帐篷前激烈讨论,小王打听了下了解到, 马戏团正打算出一个新节目“最高罗汉塔”,即马戏团员叠罗汉表演。考虑到安全因素,要求叠罗汉过程中,站在某个人肩上的人应该既比自己矮又比自己瘦,或相等。 团长想要本次节目中的罗汉塔叠的最高,由于人数众多,正在头疼如何安排人员的问题。小王觉得这个问题很简单,于是统计了参与最高罗汉塔表演的所有团员的身高体重,并且很快找到叠最高罗汉塔的人员序列。 现在你手上也拿到了这样一份身高体重表,请找出可以叠出的最高罗汉塔的高度,这份表中马戏团员依次编号为1到N。
输入描述:
首先一个正整数N,表示人员个数。 之后N行,每行三个数,分别对应马戏团员编号,体重和身高。
输出描述:
正整数m,表示罗汉塔的高度。
输入例子:
6 1 65 100 2 75 80 3 80 100 4 60 95 5 82 101 6 81 70
输出例子:
4
动态规划,用到了最长上升子序列问题。首先按照体重从小到大排序,体重相同时,身高高的在上,然后求最长身高上升子序列的长度。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace::std;
struct node {
int w;
int h;
node(int _w, int _h) : w(_w), h(_h) {}
};
bool cmp(node first, node next) {
if (first.w != next.w) {
return first.w < next.w;
}
else {
return first.h > next.h;
}
}
int main() {
int input;
while (cin >> input) {
int num, w, h;
vector<node> vec;
for (int i = 0; i < input; ++i) {
cin >> num >> w >> h;
node tmp(w, h);
vec.push_back(tmp);
}
stable_sort(vec.begin(), vec.end(), cmp);
vector<int> dq(input + 1, 0);
dq[0] = 1;
for (int i = 0; i < input; ++i) {
dq[i] = 1;
for (int j = 0; j < i; ++j) {
if (vec[j].h <= vec[i].h && dq[j] + 1 >= dq[i]) {
dq[i] = dq[j] + 1;
}
}
}
int max = 0;
for (int i = 0; i < dq.size(); ++i) {
if (max < dq[i]) max = dq[i];
}
cout << max << endl;
}
return 0;
}