luogu2704[NOI2001]炮兵阵地

原创 2018年04月15日 22:22:29

题目链接
因为m <= 10,考虑状压DP
先dfs搜出所有可能状态
f[i][j][k] 表示上上行是 i, 上行是 j, 第 k 行取得的最大值
但如果直接开满数组,MLE
考虑滚动数组
此题只需保留2个状态,上上行,上行
所以用四层循环枚举——超时
考虑剪枝
放进上上行时先与题述条件对比
放入上行是与上上行和题述条件进行比较
。。。。。。
因为这个DP数组单调递增,不用担心之前的发生冲突,不放心可以开一个used数组
最后输出,312ms,不慢

#include<bits/stdc++.h>
using namespace std;

const int N = 1 << 10 | 1;

int f[N][N][3]; // f[i][j][k] 表示上上行是 i, 上行是 j, 第 k 行取得的最大值 
int g[N], v[N];
int o[101];// 每一行本身的限制 
int tot = 0;
int n, m;

void dfs(int u, int now, int cur) {
    if(u > m) {
        g[++tot] = now;
        v[tot] = cur;
        return;
    }
    dfs(u + 1, now, cur);
    dfs(u + 3, now + (1 << (u - 1)), cur + 1);
}

int main() {
    scanf("%d %d", &n, &m);
    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= m; j++) {
            char c;
            cin >> c;
            if(c == 'H') o[i] += 1 << (j - 1);
        }
    }
    dfs(1, 0, 0);
    for(int i = 1; i <= tot; i++) {
        if((g[i] & o[1]) == 0) {
            f[0][g[i]][1] = v[i];
        }
    }
    for(int i = 2; i <= n; i++) {
        for(int j = 1; j <= tot; j++) {// 上上行可能的放置方法 
            if(g[j] & o[i - 2]) continue;
            for(int l = 1; l <= tot; l++) {// 上行可能的放置方法 
                if((g[l] & o[i - 1]) || (g[l] & g[j])) continue;
                for(int k = 1; k <= tot; k++) {
                    if((g[k] & o[i]) || (g[k] & g[j]) || (g[k] & g[l])) continue;
                    f[g[l]][g[k]][i % 3] = max(f[g[l]][g[k]][i % 3], f[g[j]][g[l]][(i - 1) % 3] + v[k]);
                }
            }
        }
    }
    int ans = 0;
    for(int i = 1; i <= tot; i++) {
        for(int j = 1; j <= tot; j++) {
            /*for(int l = 1; l <= 2; l++) {
                printf("f[%d][%d][%d] = %d, ", g[i], g[j], l, f[g[i]][g[j]][l]);
            }*/
            ans = max(ans, f[g[i]][g[j]][n % 3]);
        }
    }
    printf("%d", ans);
    return 0;
} 

网络工程师IP地址计算强化训练视频教程

网络工程师考试考察知识点繁多,形式多样。如何有效把握每种考察形式,拿到相应分数?这是历年考生最挠头的事情。本系列课程紧抓考生痛点,对网工考试中重点题型分门别类讲解,反复强化训练,助力考生查缺补漏,拿到相应分数。本次分课程重点讲解了IP地址计算方法。通过基本概念阐述->历年真题强化训练->独家解题技巧总结,三大步骤帮助考生掌握IP地址计算方法,拿到相应分数。
  • 2016年08月05日 09:09

【NOI2001】炮兵阵地

【HNOI2012】射箭 【题目描述】 沫沫最近在玩一个二维的射箭游戏,如下图 1 所示,这个游戏中的 x 轴在地面,第一象限中有一些竖直线段作为靶子,任意两个靶子都没有公共部分,也不会接触坐...
  • u013554919
  • u013554919
  • 2014-04-16 12:50:30
  • 816

POJ 1185 [NOI2001 D2T?] 炮兵阵地

状压DP+位运算
  • SenyeLicone
  • SenyeLicone
  • 2017-02-22 10:03:40
  • 527

洛谷 P2704 [NOI2001]炮兵阵地

题目大意: 给出N*M的地图,有很多空地P跟山地H,炮台可以攻击周边: 求最多能放多少个炮台并且他们互不攻击。 N≤100;M≤10 题解: 这题是状压dp的一道经典题目, 对于每行1...
  • Gx_Man_VIP
  • Gx_Man_VIP
  • 2018-01-12 21:06:29
  • 96

poj1185&&vijos1424&&COGS301 [NOI2001]炮兵阵地

描述司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队。一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示)...
  • SLYZ_wumingshi
  • SLYZ_wumingshi
  • 2017-04-01 14:49:17
  • 261

[NOI2001][POJ1185]炮兵阵地(状压dp)

题目描述传送门题解m很小并且山地和平原、放置与不放置可以用01表示,所以一看就是状压dp。 但是炮可以打到上下两个格子这一点很烦人,这样的话不能用前一行向当前行转移,因为有可能在前一行的前一行存在一...
  • Clove_unique
  • Clove_unique
  • 2016-10-31 23:34:17
  • 779

POJ 1185 NOI 2001 炮兵阵地 状压DP

题目大意:给出一个地图,有两种点,P点可以站人,H点不能站人。每放一个人就会对他上下左右各两个格子产生影响,产生影响的格子不能放人。问最多能放多少个人。 思路:数据范围指引解题的方向。题中给...
  • jiangyuze831
  • jiangyuze831
  • 2014-10-30 13:18:29
  • 743

NOI2001《炮兵阵地》 状压DP

炮兵阵地 Time Limit:1000MS  Memory Limit:65536K Total Submit:30 Accepted:14 Description   司令部的将军们打算在...
  • masterwater
  • masterwater
  • 2016-04-15 21:26:36
  • 141

【洛谷2704】【NOI2001】炮兵阵地

司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队。一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图。在每一格平原地形上最多可以布置...
  • dcx2001
  • dcx2001
  • 2017-09-09 21:09:03
  • 42

NOI2001 炮兵阵地

  • 2012年10月12日 22:00
  • 2KB
  • 下载
收藏助手
不良信息举报
您举报文章:luogu2704[NOI2001]炮兵阵地
举报原因:
原因补充:

(最多只允许输入30个字)