题意:找到体重递增速度递降的最长序列
分析:和最长递增子序列一样,不过这里先做处理:先把体重按递增排序,然后找最长递降子序列即可
代码:
#include<iostream> #include<algorithm> #include<cstdio> using namespace std; struct node{ int w,s; int t; }a[2000]; int n,i; struct h{ int x; int pre; }dp[2000]; int ans[2000],g; bool cmp(node p,node q) { if(p.w!=q.w) return p.w<q.w; return p.s>q.s; } int max(int p,int q) { return p>q?p:q; } void prin(int index) { int j=index; if(dp[j].pre!=j){ prin(dp[j].pre); cout<<a[j].t<<endl; } else cout<<a[j].t<<endl; return; } int main() { i=0,g=0; int mx=-1,index; while(cin>>a[i].w>>a[i].s) i++; for(int j=0;j<i;j++){ a[j].t=j+1; } sort(a,a+i,cmp); for(int j=0;j<i;j++){ dp[j].x=1; dp[j].pre=j; } for(int j=0;j<i;j++){ for(int k=0;k<j;k++){ if(a[k].s>a[j].s&&a[k].w!=a[j].w){ if(dp[j].x<dp[k].x+1){ dp[j].x=dp[k].x+1; dp[j].pre=k; } } if(mx<dp[j].x){ mx=dp[j].x; index=j; } } } cout<<mx<<endl; prin(index); }
HDU 1160 FatMouse's Speed--dP--(元素1递增元素2递降的最长子序列)
时间: 2024-11-15 13:06:35