hdu 1160 FatMouse's Speed

解题思路:按某一维排序,则二维简化为一维。先按体重从小到大排序,再按速度从大到小排序,找出速度最长递减子序列。建一个结构体: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 1005
struct 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;
}



你可能感兴趣的:(HDU,HDU)