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

  

原文地址:https://www.cnblogs.com/zhouzhendong/p/BZOJ1207.html