標籤:lis
連結:UVa 10131
題意:給定若干大象的體重及智商值,求滿足大象體重嚴格遞增,智商嚴格遞減的序列的最大個數,
並列印任意一組取得最大值的序列的大象編號
分析:這個是LIS的應用,只不過判斷條件有兩個,可以先對大象的體重排序,但是要列印路徑,
那就必須得回溯求路徑,可以直接逆序迴圈求,當然遞迴也是一個好的選擇
#include<cstdio>#include<algorithm>using namespace std;struct stu{ int size,iq,id;}a[1005];int dp[1005],path[1005],m;int cmp(struct stu a,struct stu b){ if(a.size!=b.size) return a.size<b.size; return a.iq>b.iq;}void back_path1(int i){ if(path[i]!=i) back_path1(path[i]); printf("%d\n",a[i].id);}void back_path2(int i){ if(m--){ back_path2(path[i]); printf("%d\n",a[i].id); }}int main(){ int i=1,j,n,k,b[1005]; while(scanf("%d%d",&a[i].size,&a[i].iq)!=EOF){ a[i].id=i; i++; } n=i-1; sort(a+1,a+n+1,cmp); for(i=1;i<=n;i++){ dp[i]=1; path[i]=i; for(j=1;j<i;j++) if(a[j].size<a[i].size&&a[j].iq>a[i].iq&&dp[j]+1>dp[i]){ dp[i]=dp[j]+1; path[i]=j; } } k=1; for(i=2;i<=n;i++) if(dp[i]>dp[k]) k=i; m=dp[k]; printf("%d\n",m); b[1]=a[k].id; i=2; for(j=k;j>=1;j--) //直接逆序迴圈求路徑 if(a[j].size<a[k].size&&a[j].iq>a[k].iq&&dp[k]==dp[j]+1){ b[i++]=a[j].id; dp[k]--; } for(j=i-1;j>=1;j--) printf("%d\n",b[j]); //back_path1(k); //可以用兩種遞迴求路徑 //back_path2(k); return 0;}