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

      

  • 相关阅读:
    每日日报
    每日日报
    每日日报
    每日日报
    每日日报
    动手动脑2
    动手动脑3
    每日日报
    每周总结
    Java学习
  • 原文地址:https://www.cnblogs.com/zhouzhendong/p/BZOJ1207.html
Copyright © 2020-2023  润新知