hdu 1160 题意
题意:第1列单调递增,第2列单调递减,满足这两个要求最长的子序列。
ac代码:
View Code
#include<iostream> #include<stack> #include<algorithm> using namespace std; struct node{ int num;//记录输入的顺序 int weight; int rate; const bool operator<(struct node &d)const{ //重载小于号,作用:结构体中的元素按weight的升序排列 return weight<d.weight; } }; struct node str[1009]; int f[1009];//f[]:以第i个结束的最长子序列 stack<struct node>s; int main(){ memset(f,0,sizeof(f)); int n,m; int num=0; int i,j; struct node temp; while(cin>>n>>m){ //输入只有一组数据 temp.num=num+1; temp.weight=n; temp.rate=m; str[num]=temp; num++; } int max; int mm=-1,k; sort(str,str+num); f[0]=1; for(i=1;i<num;i++){ //此程序精华 max=-1; for(j=i-1;j>=0;j--){ if(str[i].rate<str[j].rate &&str[i].weight>str[j].weight){ if(max<f[j]){ max=f[j]; } } } if(max==-1) f[i]=1; else f[i]=max+1; if(mm<=f[i]){ mm=f[i]; k=i; } } s.push(str[k]); j=f[k]; int l=k; for(i=l;i>=0;i--){ if(f[i]==f[k]-1&&s.top().rate<str[i].rate&&s.top().weight>str[i].weight){ s.push(str[i]); k=i; } } cout<<s.size()<<endl; while(!s.empty()){ cout<<s.top().num<<endl; s.pop(); } return 0; }