hdu1160 FatMouse's Speed 【最長下降子序列+記錄路徑】
阿新 • • 發佈:2018-12-28
#include<stdio.h> #include<algorithm> #include<iostream> #include<string.h> #include<vector> using namespace std; struct node{ int hao; int w; int v; node(){ } node(int _hao,int _w,int _v) { hao = _hao; w = _w; v = _v; } }; node a[1005]; int dp[1005]; //node b[1005]; bool cmp1(node x,node y) { if(x.w==y.w) return x.v>y.v; return x.w<y.w; } int main() { int W,V,st; int cnt=1; while(cin>>W>>V) { a[cnt].hao=cnt; a[cnt].w = W; a[cnt].v =V; /*b[cnt].hao = cnt; b[cnt].w =W; b[cnt].v =V;*/ cnt++; } sort(a+1,a+cnt,cmp1); //sort(b+1,b+cnt,cmp2); int vis[1005]; for(int i=0;i<1005;i++) vis[i]=-1; for(int i=0;i<cnt;i++) dp[i]=1; int ans = 0; for(int j=1;j<cnt;j++) { for(int i=1;i<j;i++) { if(a[j].v<a[i].v) { if(a[j].w == a[i].w) continue; //dp[j]=max(dp[j],dp[i]+1); if(dp[j]<dp[i]+1) { dp[j]=dp[i]+1; vis[j]=i; //這裡記錄路徑,實際上就是一個索引 } } } //ans = max(ans,dp[j]); if(ans<dp[j]) { ans = dp[j]; st = j; //記錄最後一個位置,以便找到之前的數 } } cout<<ans<<endl; vector<int> vt; vt.clear(); while(st!=-1) { vt.push_back(a[st].hao); st = vis[st]; } for(int i=vt.size()-1 ;i>=0;i--) { printf("%d\n",vt[i]); } return 0; }