输入描述:
首先一个正整数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;
}
第二次做:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace::std ;
struct node {
int w ;
int 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 ) {
vector<node> vec ;
for ( int i = 0; i < input; ++ i ) {
int num, w, h ;
cin >> num >> w >> h ;
node tmp ;
tmp.w = w ;
tmp.h = 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 < input; ++ i ) {
if ( max < dq[i] ) max = dq[i] ;
}
cout << max << endl ;
}
return 0 ;
}
第三次做:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace::std ;
struct node {
int w ;
int 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 n ;
while ( cin >> n ) {
if ( n <= 0 ) break ;
vector<node> vec ;
for ( int i = 0; i < n; ++ i ) {
int num, weight, height ;
cin >> num >> weight >> height ;
node tmp ;
tmp.w = weight ;
tmp.h = height ;
vec.push_back( tmp ) ;
}
stable_sort( vec.begin(), vec.end(), cmp ) ;
vector<int> liss( n + 1, 1 ) ;
int max = 0 ;
for ( int i = 0; i < n; ++ i ) {
for ( int j = 0; j < i; ++ j ) {
if ( vec[j].h <= vec[i].h && liss[j] + 1 > liss[i] ) {
liss[i] = liss[j] + 1 ;
if ( max < liss[i] ) max = liss[i] ;
}
}
}
cout << max << endl ;
}
return 0 ;
}