hdu 1160 FatMouse's Speed

来源:互联网 发布:音效制作软件 编辑:程序博客网 时间:2024/04/30 13:33

解题思路:按某一维排序,则二维简化为一维。先按体重从小到大排序,再按速度从大到小排序,找出速度最长递减子序列。建一个结构体:struct mouse,其中weight,speed是体重和速度,num是其输入的顺序,pre是记录路径上的前一点的下标。状态转移方程为:dp[i]=dp[j]+1; 如果 mice[i].speed<mice[j].speed && mice[i].weight>mice[j].weight ,并且dp[j]+1>dp[i]。 max{dp[i]}就是所要求的值,index为最长递减子序列的最后一个mouse,将路径逆序保存在a[]中,再顺序输出。输出有点搞,花费了较长时间。

#include<stdio.h>#include<stdlib.h>#define NUM 1005struct mouse{int weight;int speed;int num;int pre;}mice[NUM];int cmp(const void *x, const void *y){mouse *a = (mouse *)x;mouse *b = (mouse *)y;if(a->weight==b->weight)return b->speed - a->speed;return a->weight - b->weight;}int dp[NUM];int a[NUM];int main(){int n=1,i,j,max_num=-1,index;while(scanf("%d%d",&mice[n].weight,&mice[n].speed)!=EOF){mice[n].num=n;n++;}qsort(mice+1,n-1,sizeof(mice[1]),cmp);dp[1]=1;index=1;for(i=2;i<n;i++){dp[i]=1;mice[i].pre=i;for(j=1;j<i;j++){if(mice[i].speed<mice[j].speed&&dp[j]+1>dp[i]&&mice[i].weight>mice[j].weight){dp[i]=dp[j]+1;mice[i].pre = j;}}if(dp[i] > max_num){max_num=dp[i];index=i;}}printf("%d\n",max_num);n=max_num;while(dp[index]+1){a[--n]=mice[index].num;index=mice[index].pre;dp[index]--;}a[0]=mice[index].num;for(i=0;i<max_num;i++)printf("%d\n",a[i]);return 0;}