题目:给你一组大象的体重和智力,找到一组最大的体重和IQ负相关的集合。
分析:最大上升子序列LIS,由于数据规模较小,直接O(N*N)算法解决。
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
struct data
{
int Weight,IQ,id;
}D[1005];
int Front[1005];
int Length[1005];
int cmp( data a, data b )
{
if ( a.Weight == b.Weight )
return a.IQ > b.IQ;
return a.Weight < b.Weight;
}
void output( int i, int d )
{
if ( i == Front[i] )
cout << d << endl;
else output( Front[i], d+1 );
cout << D[i].id << endl;
}
int main()
{
int count = 0;
while ( cin >> D[count].Weight >> D[count].IQ ) {
D[count].id = count+1;
count ++;
}
sort( D, D+count, cmp );
for ( int i = 0 ; i < count ; ++ i ) {
Front[i] = i;
Length[i] = 1;
for ( int j = 0 ; j < i ; ++ j )
if ( Length[i] <= Length[j] && D[i].IQ < D[j].IQ
&& D[i].Weight > D[j].Weight ) {
Length[i] = Length[j]+1;
Front[i] = j;
}
}
int max = 0;
for ( int i = 0 ; i < count ; ++ i )
if ( Length[i] > Length[max] )
max = i;
output( max, 1 );
return 0;
}