1. 程式人生 > 其它 >hdu 1160 FatMouse's Speed 最長上升子序列變形+排序+方案列印

hdu 1160 FatMouse's Speed 最長上升子序列變形+排序+方案列印

一看兩個維度,下意識要麼排序再dp要麼對兩個分別開一維。

先sort可以保證體重上升,再跑最長上升子序列(對原來的數取相反數即可)。

#

填坑1:如果不存在合法解的話,ans也要更新,所以在列舉j前要加個if

填坑2:如果ans=1的話,調整一下回溯語句的順序可以防止最後一個卡了沒輸出

填坑3:改了cmp,判斷了weight相同的情況,寫了return <和return >的,仍wa

----

待填

#include <iostream>
#include <math.h>
#include <string.h>
#include <vector>
#include 
<map> #include <queue> #include <stdio.h> #include <algorithm> #include <cstdio> using namespace std; const int maxn=5000; struct lys{ int weight,speed; }mouse[maxn]; bool cmp(lys a,lys b) { if(a.weight!=b.weight) { return a.weight<b.weight; }
else { return a.speed<b.speed; } } int print[maxn],dp[maxn],fa[maxn]; int main( ){ //freopen("lys.in","r",stdin); int a,b,cnt=0; while(cin>>a>>b) { cnt++; mouse[cnt].weight=a;mouse[cnt].speed=-b; } sort(mouse+1,mouse+1+cnt,cmp);
int ans=-20211006,pos; for(int i=1;i<=cnt;i++) { dp[i]=1; fa[i]=i; if(dp[i]>ans) { ans=dp[i]; pos=i; } for(int j=1;j<=i-1;j++) { if(mouse[i].speed>mouse[j].speed) { if(dp[j]+1>dp[i]) { dp[i]=max(dp[i],dp[j]+1); fa[i]=j; if(dp[i]>ans) { ans=dp[i]; pos=i; } } } } } printf("%d\n",ans); cnt=0; for(int i=pos;;) { cnt++; print[cnt]=i; if(fa[i]==i) { break; } i=fa[i]; } for(int i=cnt;i>=1;i--) { printf("%d\n",print[i]); } }