题意: 给你若干个人的体重(w), IQ(s),让你找出最长的:w越大,s就越小的序列,并打印输出。
思路: 仿照的是最长递增子序列的代码, 可见http://blog.csdn.net/conatic/article/details/50881119
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1005;
int b[N], dp[N], pre[N], maxn = -1;
struct el{
int w, s, id;
}a[N];
int cmp (el a,el b){
return a.w < b.w;
}
void print(int i) {
if (maxn--) {
print(pre[i]);
printf("%d\n", a[i].id);
}
}
int main() {
int n = 1;
while (~scanf("%d%d", &a[n].w, &a[n].s)) {
a[n].id = n;
n++;
}
n--;
sort(a+1, a + n, cmp);
for (int i = 1; i <= n; i++) {
dp[i] = 1;
pre[i] = i;
}
int k ;
for (int i = 1; i <= n; i++) {
for (int j = 1; j < i; j++) {
if (a[j].w<a[i].w && a[j].s>a[i].s && dp[i]-1<dp[j]) {
dp[i] = dp[j] + 1;
pre[i] = j;
}
if (maxn < dp[i]) {
maxn = dp[i];
k = i;
}
}
}
printf("%d\n", maxn);
print(k);
}