题意:略。

思路:第一次写的时候搞复杂了,弄得跟计算几何似的= =

递推公式很好想,就是dp[x2][y2][t] = max(dp[x2][y2][t], dp[x1][y1][t-1] + online(x2, y2, x1, y1)。

其中dp[x2][y2][t]表示在时间点t锤子选择砸到点(x2, y2)处时的最大积分,点(x1, y1)与点(x2, y2)距离不大于d,online函数计算的是以这两点为端点的线段上有几只地鼠。

另外,本题中锤子可以砸到坐标系外面,如果不考虑此种情况会wa。处理方法是,读取坐标时横纵坐标都加5(5为锤子可移动距离d的最大值)。

更多细节见代码即注释。

 1 #include<stdio.h>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<string.h>
 5 using namespace std;
 6 int dp[32][32][12];
 7 bool mole[32][32][12];
 8 int n, d, m, maxt, mint;
 9 int online(int t,int x1,int y1,int x2,int y2)
10 {
11     int sx = min(x1, x2), ex = max(x1, x2);
12     int sy = min(y1, y2), ey = max(y1, y2);
13     int res = 0;
14     for (int x = sx; x <= ex; x++)
15         for (int y = sy; y <= ey; y++)
16             if (mole[x][y][t] && (y1 - y2) * (x - x2) == (y - y2) * (x1 - x2))
17                 res++;
18     return res;
19 }
20 bool judge(int x1,int y1,int x2,int y2)//判断距离是否不大于d
21 {
22     int tem = (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);
23     return tem <= d * d;
24 }
25 int getdp()
26 {
27     memset(dp, 0, sizeof(dp));
28     int res = 0;
29     for (int i = mint; i <= maxt; i++)//枚举时间点
30         for (int x = 0; x < n; x++)
31             for (int y = 0; y <= n; y++)//枚举锤子落点
32             {
33                 int sx = max(x - d, 1), ex = min(x + d, n);
34                 int sy = max(y - d, 1), ey = min(y + d, n);
35                 for (int px = sx; px <= ex; px++)
36                     for (int py = sy; py <= ey; py++) if (judge(x, y, px, py))//枚举锤子上次的合法落点
37                     {
38                         dp[x][y][i+1] = max(dp[x][y][i+1], dp[px][py][i] + online(i, x, y, px, py));
39                         res = max(res, dp[x][y][i+1]);
40                     }
41             }
42     return res;
43 }
44 int main()
45 {
46     //freopen("data.in", "r", stdin);
47     while (~scanf("%d%d%d", &n, &d, &m) && (n | d | m))
48     {
49         memset(mole, 0, sizeof(mole));
50         n += 10;
51         maxt = 0;
52         mint = 0x3f3f3f3f;
53         for (int i = 1; i <= m; i++)
54         {
55             int x, y, t;
56             scanf("%d%d%d",&x, &y, &t);
57             mole[x+5][y+5][t] = 1;
58             maxt = max(maxt, t);
59             mint = min(mint, t);
60         }
61         printf("%d\n",getdp());
62     }
63     return 0;
64 }

转载于:https://www.cnblogs.com/fenshen371/p/3267284.html

POJ 3034 Whac-a-Mole [DP]相关推荐

  1. POJ 3034 Whac-a-Mole(DP)

    题目链接 理解了题意之后,这个题感觉状态转移还是挺好想的,实现起来确实有点繁琐,代码能力还有待加强,经过很长时间才发现bug.注意坐标可能是负的. 1 #include <cstdio> ...

  2. POJ 2955 Brackets (区间DP)

    题目链接:http://poj.org/problem?id=2955 Brackets Time Limit: 1000MS   Memory Limit: 65536K Total Submiss ...

  3. poj 3071 Football(概率dp)

    http://poj.org/problem? id=3071 大致题意:有2^n个足球队分成n组打比赛.给出一个矩阵a[][],a[i][j]表示i队赢得j队的概率.n次比赛的流程像这样France ...

  4. poj 2817 WordStack (状态dp)

    http://poj.org/problem?id=2817 这个题的意思是第一行给出case数N (1 <= N <= 10),然后给出N个单词,每个一行,当输入不是正整数的时候结束.每 ...

  5. POJ 3280 Cheapest Palindrome(DP 回文变形)

    题目链接:http://poj.org/problem?id=3280 题目大意:给定一个字符串,可以删除增加,每个操作都有代价,求出将字符串转换成回文串的最小代价 Sample Input 3 4 ...

  6. POJ 1947 Rebuilding Roads (树dp + 背包思想)

    题目链接:http://poj.org/problem?id=1947 一共有n个节点,要求减去最少的边,行号剩下p个节点.问你去掉的最少边数. dp[u][j]表示u为子树根,且得到j个节点最少减去 ...

  7. poj 3590 The shuffle Problem——DP+置换

    题目:http://poj.org/problem?id=3590 bzoj 1025 的弱化版.大概一样的 dp . 输出方案的时候小的环靠前.不用担心 dp 时用 > 还是 >= 来转 ...

  8. POJ 3133 Manhattan Wiring(插头DP)

    题目链接:http://poj.org/problem?id=3133 题意:n*m的格子中有两个2和两个3,其余是空白或障碍.找出两条路径分别连接2和3,不经过障碍且不相交.使得两条路径长度和最短? ...

  9. POJ 1625 Censored ( Trie图 DP 高精度 )

    题意 : 给出 n 个单词组成的字符集 以及 p 个非法串,问你用字符集里面的单词构造长度为 m 的单词的方案数有多少种? 分析 : 与 POJ 2778 非常相似的一道题目,如果没有做过就尝试去了解 ...

最新文章

  1. 平民架构的春天——UCloud数据方舟实战记
  2. java web运行的快慢_WebAssembly执行速度真的很强悍吗?对微软Edge很无语
  3. Azure:不能把同一个certificate同时用于Azure Management和RDP
  4. java jvm调优_(第2部分,共3部分):有关性能调优,Java中的JVM,GC,Mechanical Sympathy等的文章和视频的摘要...
  5. “先粗后精”的实例分割,BPR:使用Crop-then-Refine的性能提高方法
  6. js时间搓化为今天明天_踩雷预警!爆款好物怎么都变成了“搓泥宝”?
  7. 30 万奖金等你来!第三届 Apache Flink 极客挑战赛暨 AAIG CUP 报名开始
  8. Java 连接SQLite数据库
  9. WSO2 IS 添加新的证书域名
  10. 七自由度冗余机械臂运动学逆解与工作空间分析MATLAB实现
  11. 基于matlab的-数字调制技术仿真
  12. 【计算机毕业设计】外卖点餐源码
  13. 获取应用包名、获取应用名称、获取MetaData值、获取应用所有Permission、获取permission对应描述信息
  14. SpringBoot + Springmvc集成guava
  15. 数据的描述性统计与python实现
  16. 《奇点来临》——Linked-In上“奇点临近”论坛的观点
  17. spring boot 搭建的一个企业级快速开发脚手架
  18. 《游戏学习》| 微信对话模拟生成器源码分析
  19. Windows10 Technical Preview使用感受!
  20. 百度智能云,沈抖拿到第二个KPI

热门文章

  1. 函数动态传参详细,作用域和名称空间,global和nonlocal
  2. 数字取整或保留小数四舍五入的正确写法
  3. SpringMVC中的文件上传
  4. 虚幻4 远处的贴图模糊处理
  5. ChartType属性
  6. 集合,stack,queue,dictionary,ArrayList,listT
  7. PHP 5.4 的新特性
  8. python项目实战:获取本机所有IP地址的方法
  9. linux运行jar文件
  10. Linux程序包管理(yum)