BZOJ1207 [HNOI2004]打鼹鼠 动态规划
欢迎访问~原文出处——博客园-zhouzhendong
去博客园看该题解
题目传送门 - BZOJ1207
题目概括
n*n的方阵上,一开始你可以在任何地方。
你每秒可以移动一格,接下来有m只地鼠冒出来,给出他们的时间、位置。
问你最多可以打掉几只地鼠。时间可能重复。
n<=1000, m<=10000
题解
时限有10S。
然而m只有10000 。
那么我们用最大力的动态规划。
先给所有的地鼠按照时间排个序。
dp[i]表示前i个地鼠第i个必打,最多能打的地鼠个数。
然后m2暴力转移一下就可以了。
代码
#include <cstring> #include <algorithm> #include <cstdio> #include <cstdlib> #include <cmath> using namespace std; const int N=1000+5,M=10000+5; struct Mouse{ int t,x,y; bool operator < (const Mouse a)const { return t<a.t; } }a[M]; int n,m,dp[M]; int dis(Mouse a,Mouse b){ return abs(a.x-b.x)+abs(a.y-b.y); } int main(){ scanf("%d%d",&n,&m); for (int i=1;i<=m;i++) scanf("%d%d%d",&a[i].t,&a[i].x,&a[i].y); sort(a+1,a+m+1); memset(dp,0,sizeof dp); int ans=0; for (int i=1;i<=m;i++){ dp[i]=1; for (int j=1;j<i;j++) if (dis(a[i],a[j])<=a[i].t-a[j].t) dp[i]=max(dp[i],dp[j]+1); ans=max(ans,dp[i]); } printf("%d",ans); return 0; }