HDU 1160 最长下降子序列(错误代码也可能通过,误导啊)

写的代码有点垃圾,改天优化一下。

#include <iostream>
#include <algorithm>
using  namespace std;
const int N = 1001;
int dp[N];
int front[N];
int p[N];
typedef struct  
{
	int weight;
	int speed;
	int num;
} mice;
mice mouse[N];

bool cmp(mice lhs, mice rhs)
{
	return lhs.weight < rhs.weight; //体重递增排序
}
int main()
{
	int t = 0;
	while(cin >> mouse[t].weight >> mouse[t].speed)
	{
		mouse[t].num = t + 1;
		t++;
	}
	sort(mouse, mouse + t, cmp);

	memset(dp, 0, sizeof(dp));
	memset(front, 0, sizeof(front));
	//最递减子序列
	for(int i = 0; i < t; i++)
	{
		dp[i] = 1;
		front[i] = -1;
		for(int j = i - 1; j >= 0; j--)
		{
			if(mouse[j].speed > mouse[i].speed && dp[j] + 1 > dp[i] && mouse[i].weight > mouse[j].weight)
			{
				dp[i] = dp[j] + 1;
				front[i] = j;
			}
		}
	}
	int max = 0;
	for(int i = 0; i < t; i++)
		if(dp[i] > dp[max])
			max = i;
	cout << dp[max] << endl;

	int k = 0;
	while(front[max] != -1)
	{
		p[k++] = mouse[max].num;
		max = front[max];
	}
	p[k++] = mouse[max].num;
	while(k--)
		cout << p[k] << endl;
	return 0;
}

写了初始版本后,偷懒参考了一篇代码,该代码提交能够AC,但是我跟他一样写的(只是他qsort,我用的sort),导致了我输出的结果一直很怪异。郁闷了半天。

通过输出比较,我发现qsort的只是将重量排序,而sort将速度也排序,导致的结果不同。而根本原因是,该代码只是碰巧可以通过,如果题目换个测试例子,将重量也递减,是不可能通过的。所以正确的做法应该是要判断重量是否相同,相同则不考虑。 该代码没有考虑重量,居然AC,使我一直以为不用判断重量,ac不了。一字一句地对照了半天。

非吐槽不可了。

#include <stdio.h>
#include <stdlib.h>
struct No
{
	int w;
	int s;
	int num;
}a[1005];
int cmp(const void *c,const void *d)
{
	return *(int *)c-*(int *)d;
}
int main ()
{
	int n=0,i,j,k,max;
	int m[1005],pre[1005],p[1005];
	while (scanf("%d %d",&a[n].w,&a[n].s)!=EOF)
	{
		a[n].num=n+1;
		n++;
	}
	qsort(a,n,sizeof(a[0]),cmp);
	for (i=0;i<n;i++)
	{
		m[i]=1;pre[i]=-1;
		for (j=i-1;j>=0;j--)
		{
			if (a[j].s>a[i].s && m[j]+1>m[i])
			{
				m[i]=m[j]+1;
				pre[i]=j;
			}
		}
	}
	for (max=0,i=0;i<n;i++)
		if (m[i]>m[max]) max=i;
	printf("%d\n",m[max]);
	k=0;
	while (pre[max]!=-1)
	{
		p[k++]=a[max].num;
		max=pre[max];
	}
	p[k++]=a[max].num;
	while (k--)
		printf ("%d\n",p[k]);
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值