链接:点击打开链接
题意:给定一些猫的属性:体重和速度,求一个最长的序列使得使得体重上升,速度下降
代码:
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
struct node{
int a,b,id;
friend bool operator<(node x,node y){
if(x.a==y.a)
return x.b>y.b;
return x.a<y.a;
}
}s[1005];
int main(){
int dp[1005],pre[1005];
int i,j,n,max_len,max_end;
vector<int> path;
n=1,max_len=0;
fill(dp,dp+1005,1);
memset(pre,0,sizeof(pre));
while(scanf("%d%d",&s[n].a,&s[n].b)!=EOF){
s[n].id=n;
n++;
}
n--;
sort(s+1,s+n+1); //先按第一个值排序,在对
for(i=1;i<=n;i++){ //第二个字求最长下降子序列
for(j=1;j<i;j++){
if(s[i].a>s[j].a&&s[i].b<s[j].b)
if(dp[i]<dp[j]+1){
dp[i]=dp[j]+1;
pre[i]=j; //记录每一个的前驱
if(dp[i]>max_len){
max_len=dp[i];
max_end=i;
}
}
}
}
printf("%d\n",max_len);
for(i=0;i<max_len;i++){ //因为是倒置记录因此需要
path.push_back(max_end); //变成正序
max_end=pre[max_end];
}
for(i=max_len-1;i>=0;i--)
printf("%d\n",s[path[i]].id);
return 0;
}