hdu 2881 Jack's struggle(DP)

对于所有的任务所在的地点按照时间排序,可以将其看成是一道非常简单的“天上掉馅饼”的题的二维版本。

将这些任务看成从天而降的馅饼,统计有哪些之前馅饼掉落的位置可以在两者时间差内到达该点的点,取其最大值。

这道题的数据很邪门,题目没有给出任何提示,但是用C++提交的话会超时,用G++提交的话3000+ms可以A掉,查了1700ms。我看提交的代码都是G++。这不合适吧?

 

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

#include<cmath>

#define N 10005

struct node

{

	int x,y;

	int t;

}a[N];

int dp[N];

int cmp(const void *a,const void *b)

{

	return (*(node *)a).t-(*(node *)b).t;

}

int Max(int x,int y)

{

	if(x>y)

		return x;

	return y;

}

int main()

{

	int n,m;

	while(scanf("%d%d",&m,&n),m||n)

	{

		int i,j;

		for(i=1;i<=n;i++)

			scanf("%d%d%d",&a[i].t,&a[i].x,&a[i].y);

		qsort(a+1,n,sizeof(a[0]),cmp);

		memset(dp,0,sizeof(dp));

		for(i=1;i<=n;i++)

		{

			dp[i]=1;

			for(j=1;j<i;j++)

			{

				if(abs(a[j].x-a[i].x)+abs(a[j].y-a[i].y)<=a[i].t-a[j].t)

					dp[i]=Max(dp[i],dp[j]+1);

			}

		}

		int max=0;

		for(i=1;i<=n;i++)

			max=Max(max,dp[i]);

		printf("%d\n",max);

	}

	return 0;

}


 

 

你可能感兴趣的:(HDU)