POJ 3034 Whac-a-Mole(DP)

题目链接

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

思路 : Dp[i][j][k]代表点(i,j)在第k秒最多可以得多少分。等于dp[x][y][k-1](点(x,y)为任意一个一秒内能到达(i,j)的点)+ 两点确定的直线上出现的地鼠数。求最大值。

 1 //3034
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <iostream>
 6 #include <algorithm>
 7
 8 using namespace std ;
 9
10 int mapp[30][30][20] ;
11 int dp[30][30][20];
12 int n , d,m ;
13
14 int gcd(int a,int b)
15 {
16     return (a == 0) ? b : gcd(b % a, a) ;
17 }
18
19 int getsum(int sx,int sy,int ex,int ey,int t)
20 {
21     if(sx == ex && sy == ey) return mapp[sx][sy][t] ;//同一个点
22     int dx = ex-sx,dy = ey-sy ;
23     int sum = 0 ;
24     if(dx == 0)//如果两个点在同一行
25     {
26         if(sy > ey) swap(sy,ey) ;
27         for(int i = sy ; i <= ey ; i++)
28             sum += mapp[sx][i][t] ;
29         return sum ;
30     }
31     else if(dy == 0)//同一列
32     {
33         if(sx > ex) swap(sx,ex) ;
34         for(int i = sx ; i <= ex ; i++)
35             sum += mapp[i][sy][t] ;
36         return sum ;
37     }
38     else
39     {
40         int g = gcd(abs(dx),abs(dy)) ;
41         dx /= g ;
42         dy /= g ;
43         for(int i = 0 ; i <= g ; i++)//这条斜线上的所有整点
44             sum += mapp[dx * i + sx][dy * i + sy][t] ;
45         return sum ;
46     }
47 }
48 int main()
49 {
50     while(cin >> n >> d >> m)
51     {
52         if(n == 0 && d == 0 && m == 0) break ;
53         int x,y,t,tt = 0 ;
54         memset(dp,0,sizeof(dp)) ;
55         memset(mapp,0,sizeof(mapp)) ;
56         for(int i = 0 ; i < m ; i++)
57         {
58             cin >> x >> y >>t ;
59             mapp[x + d][y + d][t] = 1 ;
60             tt = max(tt,t) ;
61         }
62         n += 2 * d ;//因为锤子可以在某时刻到达盘外边。
63         for(int t1 = 1 ; t1 <= tt ; t1 ++)
64             for(int i = 0 ; i < n ; i ++)
65                 for(int j = 0 ; j < n  ; j++)
66                 {
67                     int sx = max(i - d,0) ;
68                     int sy = max(j - d,0) ;
69                     int ex = min(i + d,n - 1) ;
70                     int ey = min(n - 1,j + d) ;
71                     for(int x = sx ; x <= ex ; x++)
72                         for(int y = sy ; y <= ey ; y++)
73                             if(((x - i)*(x - i)+(y - j)*(y - j)) <= d * d)
74                                 dp[i][j][t1] = max(dp[x][y][t1-1]+getsum(x,y,i,j,t1),dp[i][j][t1]) ;
75                 }
76         int maxx = 0 ;
77         for(int i = 0 ; i < n ; i++)
78             for(int j = 0 ; j < n ; j++)
79                 maxx = max(dp[i][j][tt],maxx) ;
80         printf("%d\n",maxx) ;
81     }
82     return 0 ;
83 }

POJ 3034 Whac-a-Mole(DP),布布扣,bubuko.com

时间: 2024-10-17 03:37:29

POJ 3034 Whac-a-Mole(DP)的相关文章

【POJ 1191】 棋盘分割(DP)

[POJ 1191] 棋盘分割(DP) Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 13811   Accepted: 4917 Description 将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的部分继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共有n块矩形棋盘.(每次切割都只能沿着棋盘格子的边进行) 原棋盘上每一格有一个分值,一块矩形棋盘的总分为其所含各格分

poj 3267 The Cow Lexicon (dp)

链接:poj 3267 题意:给定一个主串,和单词序列,问最少在主串删除多少字母, 可以使其匹配到单词序列,如 browndcodw cow milk white black brown farmer 删除主串中的两个d,brown和cow就与整个主串匹配了 分析:dp[i]表示从主串中第i个字符开始,到第L个字符(结尾处) 这段区间最少要删除的字符数, 则状态转移方程为: dp[i]=dp[i+1]+1  不能匹配时 dp[i]=min(dp[i],dp[pos]+pos-i-m)  可以匹配

poj - 1953 - World Cup Noise(dp)

题意:n位长的01序列(0 < n < 45),但不能出现连续的两个1,问序列有多少种. 题目链接:http://poj.org/problem?id=1953 -->>设dp[i][j]表示前 i 位中第 i 位为 j 时的序列数,则状态转移方程为: dp[i][0] = dp[i - 1][0] + dp[i - 1][1]; dp[i][1] = dp[i - 1][0]; 因为对于相同的n,其结果是固定的,所以可以对一个n只计算一次,然后记住她.. #include <

poj - 1050 - To the Max(dp)

题意:一个N * N的矩阵,求子矩阵的最大和(N <= 100, -127 <= 矩阵元素 <= 127). 题目链接:http://poj.org/problem?id=1050 -->>将二维压缩为一维,对一维进行dp求解. 将二维压缩成一维: 1.第1行 2.第2行加第1行 3.第3行加第2行加第1行 -- N.第N行加第N-1行加--加第1行 1.第2行 2.第3行加第2行 -- 1.第N行 对于一维情况,设dp[i]表示以第i个元素结尾的最大连续和,则状态转移方程为

POJ 3486 &amp; HDU 1913 Computers(dp)

题目链接:PKU:HDU: PKU:http://poj.org/problem?id=3486 HDU:http://acm.hdu.edu.cn/showproblem.php?pid=1913 Description Everybody is fond of computers, but buying a new one is always a money challenge. Fortunately, there is always a convenient way to deal wi

POJ 3666 Making the Grade (DP)

题意:输入N, 然后输入N个数,求最小的改动这些数使之成非严格递增即可,要是非严格递减,反过来再求一下就可以了. 析:并不会做,知道是DP,但就是不会,菜....d[i][j]表示前 i 个数中,最大的是 j,那么转移方程为,d[i][j] = abs(j-w[i])+min(d[i-1][k]);(k<=j). 用滚动数组更加快捷,空间复杂度也低. 代码如下: #include <cstdio> #include <string> #include <cstdlib&

POJ 3666 Making the Grade(DP)

题目链接:点击打开链接 题意:给n个数, 要求把这个数列变成非减或者非增数列, 求最小该变量之和. 思路:可以这样设计DP, d[i][j]表示第i个数变成j的最优解, 这样它转移到d[i-1][k], 其中k<=j, 这是变成上升的, 代价是abs(a[i] - j). 但是数太大了, 又因为每个数肯定会变成这些数中的一个数会最优, 所以我们不妨将n个数先离散化一下, 这样状态就表示成d[i][j]表示第i个数变成第j小的数, 转移到d[i-1][k],其中k<=j. 但是这样还是超时了,

POJ 2581 Exact Change Only(dp)

Language: Default Exact Change Only Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2584   Accepted: 883 Description Boudreaux reached over and shook awake Thibodeaux, who had dozed off somewhere in New Mexico. "Where we at?" Thibod

poj 2533 Longest Ordered Subsequence(dp)

Longest Ordered Subsequence Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 36159   Accepted: 15882 Description A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let the subsequence of the given numeric sequence (a1, a2, ...

POJ 1163&amp;&amp; 3176 The Triangle(DP)

The Triangle Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 41169   Accepted: 24882 Description 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 (Figure 1) Figure 1 shows a number triangle. Write a program that calculates the highest sum of numbers passed