给出一系列大象的体重和智商,求在体重升序的排序中找出智商的最大下降序列,并输出序列。
先排序,再用LIS的动规。
WA了一次,因为输出路径的时候出了点问题。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAX_N = 1001, MAX_W = 10001, MAX_S = 10001, INF = 0x3f3f3f3f;
int N = 0;
int d[MAX_N], fa[MAX_N];
struct E
{
int n, w, s;
bool operator<(const E e) const
{
return this->w < e.w;
}
}e[MAX_N];
void print(int x)
{
if(x == -1)
return;
printf("%d\n", e[x].n+1);
print(fa[x]);
}
void solve()
{
int ans = -1, mi = -1;
for(int i = N-1; i >= 0; i--)
{
d[i] = 1;
fa[i] = -1;
for(int j = N-1; j > i; j--)
if(e[j].w != e[i].w && e[j].s < e[i].s && d[j]+1 > d[i])
{
d[i] = d[j]+1;
fa[i] = j;
}
if(ans < d[i])
{
ans = d[i];
mi = i;
}
}
printf("%d\n", ans);
print(mi);
}
int main()
{
//freopen("in.txt", "r", stdin);
while(scanf("%d%d", &e[N].w, &e[N].s) != EOF) e[N].n = N++;
sort(e, e+N);
solve();
return 0;
}