- 大意:是说给一堆体重和速度,体重上升,但是速度下降。其实就是求最长下降子序列。
- 按照关键字排序,然后dp。p[i].w!=p[j].w&&p[i].v<p[j].v&&p[i].len<p[j].len+1;
- 重点是输出,这种输出的方法之前没怎么学会;
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; struct node { int id; int w,v; int len; int pre; }p[1000005]; int dp[1000005]; bool cmp(node a,node b) { if(a.w==b.w) return a.v>b.v; return a.w<b.w; } void output(int x,node *a) { if((a+x)->len==1) { printf("%d\n",(a+x)->id); } else { output((a+x)->pre,a); printf("%d\n",(a+x)->id); } } int main() { int i,j; int n=0; i=0; memset(dp,0,sizeof(dp)); while(scanf("%d%d",&p[n].w,&p[n].v)!=EOF) { p[n].id=n+1; p[n].pre=0; p[n].len=1; n++; } sort(p,p+n,cmp); int max,x; max=0; x=0; for(i=1;i<n;i++) { p[i].pre=i; for(j=0;j<i;j++) { if(p[i].w!=p[j].w&&p[i].v<p[j].v&&p[i].len<p[j].len+1) { p[i].len=p[j].len+1; p[i].pre=j; } } } for(i=0;i<n;i++) { if(max<p[i].len) { max=p[i].len; x=i; } } printf("%d\n",max); output(x,p); }
hdu1160 FatMouse's Speed
最新推荐文章于 2021-06-01 18:00:21 发布