题意:
找到一个最长串,使得大象的体重递增,智商递减
思路:
记忆化搜索,控制好条件就行
这里一个输出路径的技巧:
先全部置为本身,那么最后一个点显然是没有下一个点的,所以当路径的值为本身是就结束了
代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 1005;
struct node {
int w;
int v;
}e[maxn];
int f[maxn];
int path[maxn];
int num;
int ans;
int dp(int cur) {
if(f[cur]) return f[cur];
int a;
for(int i=0; i<num; i++)
if(e[i].w > e[cur].w && e[i].v<e[cur].v) {
a = dp(i)+1;
if(f[cur] <= a) {
f[cur] = a;
path[cur] = i;
}
}
return f[cur];
}
int main() {
int a, b;
num = 0;
while(scanf("%d%d", &a, &b)!=EOF) {
e[num].w = a;
e[num].v = b;
num++;
}
for(int i=0; i<num; i++) {
path[i] = i;
}
ans = 0;
int flag;
for(int i=0; i<num; i++) {
if(!f[i])
dp(i);
if(ans < f[i]) {
ans = f[i];
flag = i;
}
}
printf("%d\n", ans+1);
int i;
for(i=flag; path[i]!=i; i=path[i]) {
printf("%d\n", i+1);
}
printf("%d\n", i+1);
return 0;
}