poj 3034 Whac-a-Mole

http://poj.org/problem?id=3034

题意:打地鼠游戏中,你有一个锤子,每一秒钟你可以拿着锤子移动d个单位的距离,掠过的鼠洞中露出的地鼠都会被锤打至,而事先知道从开始时各时间段内出现在老鼠的数量和位置,问题是从游戏开始至结束时,你最多能打到多少只地鼠,开始时锤子可以在任何位置。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 using namespace std;
 5
 6 int dp[35][35][35];
 7 int c[35][35][35];
 8 int n,d,m;
 9
10 int gcd(int a,int b)
11 {
12     return (a==0)?b:gcd(b%a,a);
13 }
14
15 int get(int x1,int y1,int x2,int y2,int t)
16 {
17     int dx=x2-x1;
18     int dy=y2-y1;
19     if(dx==0&&dy==0) return c[x2][y2][t];
20     int sum=0;
21     if(dx==0)
22     {
23         if(y1>y2) swap(y1,y2);
24         for(int i=y1; i<=y2; i++)
25         {
26             sum+=c[x2][i][t];
27         }
28         return sum;
29     }
30     if(dy==0)
31     {
32         if(x1>x2)swap(x1,x2);
33         for(int i=x1; i<=x2; i++)
34         {
35             sum+=c[i][y1][t];
36         }
37         return sum;
38     }
39     int g=gcd(abs(dx),abs(dy));
40     dx=dx/g;
41     dy=dy/g;
42     for(int i=0; i<=g; i++)
43     {
44         sum+=c[x1+i*dx][y1+i*dy][t];
45     }
46     return sum;
47 }
48
49 int main()
50 {
51     while(scanf("%d%d%d",&n,&d,&m)!=EOF)
52     {
53         int max1=0;
54         memset(dp,0,sizeof(dp));
55         memset(c,0,sizeof(c));
56         if(n==0&&d==0&&m==0) break;
57         for(int i=0; i<m; i++)
58         {
59             int x,y,t1;
60             scanf("%d%d%d",&x,&y,&t1);
61             max1=max(max1,t1);
62             c[x+d][y+d][t1]=1;
63         }
64         n=n+2*d;
65         for(int t=1; t<=max1; t++)
66         {
67             for(int i=0; i<n; i++)
68             {
69                 for(int j=0; j<n; j++)
70                 {
71                     for(int x2=0; x2<n ; x2++)
72                     {
73                         for(int y2=0; y2<n; y2++)
74                         {
75                             if((i-x2)*(i-x2)+(j-y2)*(j-y2)<=d*d)
76                             {
77                                 int ans=get(x2,y2,i,j,t);
78                                 dp[t][i][j]=max(dp[t][i][j],dp[t-1][x2][y2]+ans);
79                             }
80                         }
81                     }
82                 }
83             }
84         }
85         int max2=0;
86         for(int i=0; i<n; i++)
87         {
88             for(int j=0; j<n; j++)
89             {
90                 max2=max(max2,dp[max1][i][j]);
91             }
92         }
93         printf("%d\n",max2);
94     }
95     return 0;
96 }

poj 3034 Whac-a-Mole,布布扣,bubuko.com

时间: 2024-10-25 14:43:13

poj 3034 Whac-a-Mole的相关文章

【POJ 3034】 Whac-a-Mole(DP)

[POJ 3034] Whac-a-Mole(DP) Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 3621   Accepted: 1070 Description While visiting a traveling fun fair you suddenly have an urge to break the high score in the Whac-a-Mole game. The goal of the W

POJ 3034 Whac-a-Mole(DP)

题目链接 题意 : 在一个二维直角坐标系中,有n×n个洞,每个洞的坐标为(x,y), 0 ≤ x, y < n,给你一把锤子可以打到地鼠,最开始的时候,你可以把锤子放在任何地方,如果你上一秒在(x1,y1),那下一秒直线移动到的整数点(x2,y2)与这个点的距离小于等于d,并且当锤子移动(x2,y2)这个点时,所有在两点的直线上的整点数都可以打到.例如(0,0)移动到(0,3).如果(0,1),(0,2)有老鼠出现就会被打到.求能够打的最多老鼠. 思路 : Dp[i][j][k]代表点(i,j)

POJ 3034 DP

打地鼠游戏中,你有一个锤子,每一秒钟你可以拿着锤子移动d个单位的距离,必须是直线,掠过的鼠洞中露出的地鼠都会被锤打至,而事先知道从开始时各时间段内出现在老鼠的数量和位置,问题是从游戏开始至结束时,你最多能打到多少只地鼠,开始时锤子可以在任何位置. 题目有个陷阱, 只是说Moles出现的坐标为正,但没说hammer移动的位置要为正,可以为"any position" 所以锤子可以移出矩阵,再从矩阵外一点移进来 例: 20 5 4 1 0 1 0 1 1 0 5 2 1 6 2 0 0 0

(中等) POJ 3034 Whac-a-Mole,DP。

Description While visiting a traveling fun fair you suddenly have an urge to break the high score in the Whac-a-Mole game. The goal of the Whac-a-Mole game is to… well… whack moles. With a hammer. To make the job easier you have first consulted the f

POJ题目分类推荐 (很好很有层次感)

著名题单,最初来源不详.直接来源:http://blog.csdn.net/a1dark/article/details/11714009 OJ上的一些水题(可用来练手和增加自信) (POJ 3299,POJ 2159,POJ 2739,POJ 1083,POJ 2262,POJ 1503,POJ 3006,POJ 2255,POJ 3094) 初期: 一.基本算法: 枚举. (POJ 1753,POJ 2965) 贪心(POJ 1328,POJ 2109,POJ 2586) 递归和分治法. 递

POJ 刷题指南

OJ上的一些水题(可用来练手和增加自信) (POJ 3299,POJ 2159,POJ 2739,POJ 1083,POJ 2262,POJ 1503,POJ 3006,POJ 2255,POJ 3094) 初期: 一.基本算法: 枚举. (POJ 1753,POJ 2965) 贪心(POJ 1328,POJ 2109,POJ 2586) 递归和分治法. 递推. 构造法.(POJ 3295) 模拟法.(POJ 1068,POJ 2632,POJ 1573,POJ 2993,POJ 2996) 二

POJ - 3186 Treats for the Cows (区间DP)

题目链接:http://poj.org/problem?id=3186 题意:给定一组序列,取n次,每次可以取序列最前面的数或最后面的数,第n次出来就乘n,然后求和的最大值. 题解:用dp[i][j]表示i~j区间和的最大值,然后根据这个状态可以从删前和删后转移过来,推出状态转移方程: dp[i][j]=max(dp[i+1][j]+value[i]*k,dp[i][j-1]+value[j]*k) 1 #include <iostream> 2 #include <algorithm&

POJ 2533 - Longest Ordered Subsequence(最长上升子序列) 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:http://poj.org/problem?id=2533 Description A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let the subsequence of the given numeric sequence (a1, a2, ..., aN) be any sequence (ai1, ai2, ..., aiK)

POJ——T2271 Guardian of Decency

http://poj.org/problem?id=2771 Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 5932   Accepted: 2463 Description Frank N. Stein is a very conservative high-school teacher. He wants to take some of his students on an excursion, but he is