最长上升子序列,不过需要略微处理一下,先按重量从小到大排一下序,然后找IQ的最长下降子序列。
代码如下:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
struct elephant
{
int wei, iq, num;
} ele[1002];
int cct, dp[1002];
int cmp(const void *a, const void *b)
{
struct elephant *aa = (struct elephant*)a;
struct elephant *bb = (struct elephant*)b;
return (aa->wei) - (bb->wei);
}
int DP(int i)
{
if(dp[i] > 0)
return dp[i];
dp[i] = 1;
for(int j=i+1; j<cct; ++j)
if( (ele[j].iq < ele[i].iq)
&&(ele[j].wei > ele[i].wei) )
{
int ans = DP(j) + 1;
if(dp[i] < ans)
dp[i] = ans;
}
return dp[i];
}
void print(int i)
{
printf("%d\n", ele[i].num + 1);
for(int j=0; j<cct; ++j)
if( (ele[j].iq < ele[i].iq)
&&(ele[j].wei > ele[i].wei)
&&(dp[i] == dp[j] + 1) )
{
print(j);
break;
}
}
int main()
{
#ifdef test
freopen("input.txt", "r", stdin);
#endif
cct = 0;
while(scanf("%d%d", &ele[cct].wei, &ele[cct].iq) != EOF)
{
ele[cct].num = cct;
++cct;
}
memset(dp, 0, sizeof(dp));
qsort(ele, cct, sizeof(ele[0]), cmp);
int Max = 0, maxi;
for(int i=0; i<cct; ++i)
{
int ans = DP(i);
if(ans > Max)
{
Max = ans;
maxi = i;
}
}
printf("%d\n", Max);
print(maxi);
return 0;
}