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; }