当前位置: 首页 > news >正文

POJ-3034 Whac-a-Mole 动态规划

这题要考虑锤子移动到网格外部的情况,否则WA,处理的方式就是行和列同时增加5(最大距离).

详见代码:

#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <iostream>
using namespace std;

/*
题意:给定一个N*N的矩阵, 然后在这个矩阵的每个格子在任意时间会出现一个鼹鼠,这个出现
     出现鼹鼠的时间是输出信息所确定的. 现在你手里有一把锤子能够去锤这些鼹鼠. 你能
     够移动锤子,移动的两点之间的距离不能超过d,且中心在这条路径上的鼹鼠到都要受到
     打击. 每个鼹鼠出现的时间值维持一秒钟. 现在问在一次游戏中最多打到多少鼹鼠 
     
解法:dp[k][i][j]第k分钟在[i, j]点时的最多打到的鼹鼠个数. 那么有动态方程:
     dp[k][i][j] = max(dp[k-1][m][n] + online); 其中sum为在(m,n)->(i,j)这条长度最多d
     的线上的且在第k-1分钟出现的鼹鼠的个数.
*/

int N, d, M, MaxTi, dp[15][35][35];
char G[12][35][35];

bool judge(int &x1, int &y1, int &x2, int &y2) {
    return (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) <= d*d;
}

int online(int k, int x1, int y1, int x2, int y2) {
    int ret = 0;
    if (x1 > x2) {
        swap(x1, x2);
        swap(y1, y2);
    }// 将两个点的关系做一个转换
    if (x1 == x2) {
        if (y1 > y2) swap(y1, y2);
        for (int j = y1; j <= y2; ++j) {
            if (G[k-1][x1][j]) ++ret;    
        }
        return ret;
    }
    if (y1 == y2) {
        for (int i = x1; i <= x2; ++i) {
            if (G[k-1][i][y1]) ++ret;    
        }
        return ret;
    }
    for (int i = x1; i <= x2; ++i) {
        if ((y2*(i-x1)-y1*(i-x2))%(x2-x1) == 0) {
            if (G[k-1][i][(y2*(i-x1)-y1*(i-x2))/(x2-x1)]) {
                ++ret;
            }
        }
    }
    return ret;
}

int DP() {
    ++MaxTi; // MaxTi出现的鼹鼠要等到MaxTi+1的时候才能够清理完 
    int L, R, U, D, ret = 0; // 四个坐标对d以内的可能点的范围给出一个约束 
    N += 10; // 由于可以移动到网格的外面,所以要加上10 
    for (int k = 2; k <= MaxTi; ++k) { // 直接计算到最后出现鼹鼠的
        for (int i = 0; i < N; ++i) {
            for (int j = 0; j < N; ++j) {
                dp[k][i][j] = 0; // 初始化 
                // 距离在d以内的点肯定出现在下面的正方形区域内,一个剪枝 
                U = max(i-d, 0), D = min(i+d, N-1);
                L = max(j-d, 0), R = min(j+d, N-1);
                for (int m = U; m <= D; ++m) {
                    for (int n = L; n <= R; ++n) {
                        if (judge(i, j, m, n)) {
                            dp[k][i][j] = max(dp[k][i][j], dp[k-1][m][n]+online(k, i, j, m, n));
                            ret = max(ret, dp[k][i][j]);
                        }
                    }
                }
            }
        }
    }
    return ret;
}

int main() {
    int x, y, ti;
    while (scanf("%d %d %d", &N, &d, &M), N|d|M) {
        // 判断距离的时候直接用平方进行比较,避免浮点精度出错 
        MaxTi = -1;
        memset(G, 0, sizeof (G));
        for (int i = 0; i < M; ++i) {
            scanf("%d %d %d", &x, &y, &ti);
            MaxTi = max(MaxTi, ti);
            G[ti][x+5][y+5] = 1; // 让坐标偏移5个单位 
        }
        printf("%d\n", DP());
    }
    return 0;    
}

 

转载于:https://www.cnblogs.com/Lyush/archive/2013/01/15/2861404.html

相关文章:

  • Android客户端采用Http 协议Post方式请求与服务端进行数据交互
  • 约定一种格式,通过约定的格式来实现一些动作,以达到作者的目的。--程序...
  • Oracle创建索引必知——献给数据库开发者
  • 友友系统:让云计算更加贴近用户
  • 同时展多个物料BOM List
  • RHEL6入门系列之十四,用户和组的基本知识
  • easyui-datagrid 报错:TypeError: col is null
  • 腾讯调整移动事业群,王小川送马化腾一记归属
  • swift学习笔记之UILabel
  • js解析与序列化json数据(二)
  • SVN的标准目录结构:trunk、branches、tags
  • 读取文件
  • mysql安装中的小问题
  • OEA ORM中的分页支持
  • Java 线程池详解
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • __proto__ 和 prototype的关系
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • CAP 一致性协议及应用解析
  • HomeBrew常规使用教程
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • JavaScript服务器推送技术之 WebSocket
  • JS函数式编程 数组部分风格 ES6版
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • React-Native - 收藏集 - 掘金
  • Spark学习笔记之相关记录
  • unity如何实现一个固定宽度的orthagraphic相机
  • 近期前端发展计划
  • 聊聊sentinel的DegradeSlot
  • 算法之不定期更新(一)(2018-04-12)
  • 微信小程序:实现悬浮返回和分享按钮
  • 为什么要用IPython/Jupyter?
  • 中文输入法与React文本输入框的问题与解决方案
  • elasticsearch-head插件安装
  • ionic异常记录
  • 关于Android全面屏虚拟导航栏的适配总结
  • 如何用纯 CSS 创作一个货车 loader
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • # 数据结构
  • #控制台大学课堂点名问题_课堂随机点名
  • #图像处理
  • (1)SpringCloud 整合Python
  • (4)事件处理——(7)简单事件(Simple events)
  • (6)设计一个TimeMap
  • (C语言)逆序输出字符串
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (ZT)出版业改革:该死的死,该生的生
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (六)vue-router+UI组件库
  • (四)JPA - JQPL 实现增删改查
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (转)使用VMware vSphere标准交换机设置网络连接
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • *ST京蓝入股力合节能 着力绿色智慧城市服务