POJ 1185-炮兵阵地

POJ 1185 炮兵阵地 (经典状态压缩题) 炮兵阵地(POJ 1185) Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 30481 Accepted: 11762 Description 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队。一个N*M的地图由N行M列组成,地图的每一格可能是山地(用”H” 表示),也可能是平原(用”P... 阅读详情
炮兵阵地
Time Limit: 2000MS Memory Limit: 65536K
Total Submissions: 20877 Accepted: 8079

Description

司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队。一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P"表示),如下图。在每一格平原地形上最多可以布置一支炮兵部队(山地上不能够部署炮兵部队);一支炮兵部队在地图上的攻击范围如图中黑色区域所示: 

如果在地图中的灰色所标识的平原上部署一支炮兵部队,则图中的黑色的网格表示它能够攻击到的区域:沿横向左右各两格,沿纵向上下各两格。图上其它白色网格均攻击不到。从图上可见炮兵的攻击范围不受地形的影响。 
现在,将军们规划如何部署炮兵部队,在防止误伤的前提下(保证任何两支炮兵部队之间不能互相攻击,即任何一支炮兵部队都不在其他支炮兵部队的攻击范围内),在整个地图区域内最多能够摆放多少我军的炮兵部队。 

Input

第一行包含两个由空格分割开的正整数,分别表示N和M; 
接下来的N行,每一行含有连续的M个字符('P'或者'H'),中间没有空格。按顺序表示地图中每一行的数据。N <= 100;M <= 10。

Output

仅一行,包含一个整数K,表示最多能摆放的炮兵部队的数量。

Sample Input

5 4
PHPP
PPHH
PPPP
PHPP
PHHP

Sample Output

6

Source

Noi 01

小结:

        这是我正式AC的第二题状态压缩DP的题目,经过反复WA之后终于得到的一次AC的那一刻,这辛酸苦楚真是难以形容,当发现仅仅是因为我没考虑row=1,2的情况而反复WA的那一刻,我深深地感觉到了自己的弱小,好了,不发表读后感了,进入正题吧。

        这题大概要考虑以下几点要素:

        1.同一行任意3个相邻的位置中只能有一个位置是安排炮兵的

        2.同一行炮兵所放的位置不能是'H'

        3.当放置一行的一种情况的时候,需要保证这种情况和前面两行的情况,同一列只能安排一个炮兵

        4.第一行和第二行的情况特殊,所以应该单独讨论

        5.枚举一行的所有情况是极其不切实际的,所以要进行筛选,经过分析,每行可以放置的炮兵情况最多有60种,至于为什么是60种,通过以下代码可以实现:

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
int check(int num)
{
    while(num)
    {
        if(num&(num<<1)||num&(num<<2))
        return 0;
        num>>=1;
    }
    return 1;
}
int main()
{
    int ans=0;
    for(int i=0;i<(1<<10);i++)
    if(check(i))
    ans++;
    printf("%d\n",ans);
    return 0;
}
        然后就是DP所必须的状态转移方程了:dp[i][j][k]=max(dp[i][j][k],dp[i-1][k][t]+count_digit(res[i][j]))

最后给出代码,真的不知道那些NB是怎么把时间变的那么短的:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<ctype.h>
#include<vector>
#include<cmath>
using namespace std;
typedef vector<int> vec;
int dp[105][65][65];
int statue[105];
vec res[105];
int maxn;
int check(int num)
{
    while(num)
    {
        if(num&(num<<1)||num&(num<<2))
        return 0;
        num>>=1;
    }
    return 1;
}
int count_digit(int num)
{
    int ans=0;
    while(num)
    {
        if(num%2)
        ans++;
        num>>=1;
    }
    return ans;
}
void input(int row,int col)
{
    char temp[15];
    for(int i=1;i<=row;i++)
    {
        scanf("%s",temp);
        for(int j=0;j<col;j++)
        {
            statue[i]<<=1;
            statue[i]|=(temp[j]=='P');
        }
        maxn=max(maxn,statue[i]);
    }
}
void init(int row,int col)
{
    for(int i=1;i<=row;i++)
    for(int j=0;j<=statue[i];j++)
    {
        if((j|statue[i])==statue[i]&&check(j))
        {
            res[i].push_back(j);
        }
    }
}
void solve(int row,int col)
{
    int ans=0;
    if(row==1)
    {
        ans=0;
        for(int i=0;i<res[1].size();i++)
        {
            ans=max(ans,count_digit(res[1][i]));
        }
        printf("%d\n",ans);
        return;
    }
    ans=0;
    for(int i=0;i<res[1].size();i++)
    {
        for(int j=0;j<res[2].size();j++)
        {
            if((res[1][i]&res[2][j])==0)
            {
                dp[2][j][i]=max(dp[2][j][i],count_digit(res[1][i])+count_digit(res[2][j]));
                ans=max(ans,dp[2][j][i]);
            }
        }
    }
    if(row==2)
    {
        printf("%d\n",ans);
        return;
    }
    for(int i=3;i<=row;i++)
    for(int j=0;j<res[i].size();j++)
    for(int k=0;k<res[i-1].size();k++)
    {
        if((res[i][j]&res[i-1][k])==0)
        for(int t=0;t<res[i-2].size();t++)
        {
            if((res[i][j]&res[i-2][t])==0&&dp[i-1][k][t]!=-1)
            dp[i][j][k]=max(dp[i][j][k],dp[i-1][k][t]+count_digit(res[i][j]));
        }
    }
    ans=0;
    for(int i=0;i<res[row].size();i++)
    for(int j=0;j<res[row-1].size();j++)
    ans=max(ans,dp[row][i][j]);
    printf("%d\n",ans);
}
int main()
{
    int row,col;
    maxn=0;
    memset(dp,-1,sizeof(dp));
    scanf("%d%d",&row,&col);
    input(row,col);
    init(row,col);
    solve(row,col);
    return 0;
}



Orin 调试GMSL camera 96712手册重点 96712基础理解 阅读详情

相关推荐

DisplayPort 1.4扰码原理与16位并行LFSR实现

DisplayPort物理层信号完整性依赖于数据扰码技术,其本质是通过线性反馈移位寄存器(LFSR)对传输数据进行伪随机化处理,以改善频谱分布、抑制低频能量堆积、提升时钟恢复能力并降低EMI辐射。该技术广泛应用于高速串行接口如DP、PCIe和USB,核心在于确定性伪随机序列生成与收发端同步。DisplayPort 1.4强制要求符合ANSI X3.230标准的16级LFSR,并在8b/10b编码后执行扰码;而传统串行实现难以满足21.6Gbps速率下的时序约束,必须采用并行展开结构——将16拍移位压缩为单周

weixin_29192211的博客 313

P2704 [NOI2001]炮兵阵地-动态规划,状压dp

司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队。一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图。在每一格平原地形上最多可以布置一支炮兵部队(山地上不能够部署炮兵部队);一支炮兵部队在地图上的攻击范围如图中黑色区域所示: 如果在地图中的灰色所标识的平原上部署一支炮兵部队,则图中的黑色的网格表示它能够攻击到的区域:沿横向...

LingFengGold 393

图像加密与解密(附matlab代码)

详细介绍了三种图像加密解密原理,并基于matlab开发了一套相应系统。

2440

炮兵阵地题解

题目描述 司令部的将军们打算在 N×M 的网格地图上部署他们的炮兵部队。一个 N×M 的地图由 N 行 M 列组成,地图的每一格可能是山地(用 H 表示),也可能是平原(用 P 表示),如下图。在每一格平原地形上最多可以布置一支炮兵部队(山地上不能够部署炮兵部队);一支炮兵部队在地图上的攻击范围如图中黑色区域所示: 如果在地图中的灰色所标识的平原上部署一支炮兵部队,则图中的黑色的网格表示它能够攻击到的区域:沿横向左右各两格,沿纵向上下各两格。图上其它白色网格均攻击不到。从图上可见炮兵的攻击范围不受地

Penguin_Wang的博客 742

【短距离通信】【WiFi】精讲WiFi 6E协议!图解超赞超详细!!!

802.11ax(HE,HighEfficiency) (Wi-Fi 6E):6G频段共有1200MHz的频谱给到WiFi 6E使用,可用于从5.925GHz到7.125GHz。WiFi将可以访问59个20MHz信道,29个40MHz信道14个80MHz信道和7个160MHz信道。这不仅代表可以有很多频道,还可以代表可以解锁更高的数据速率。因为 802.11ax 标准(Wi-Fi 6)也在 2.4GHz 和 5GHz 频段运行,所以 6GHz 频段的 Wi-Fi 将被命名为 Wi-Fi 6E。

风云说通信 2343

【Cursor+Playwright-MCP 实现 AI 自主功能测试】含实例代码脚本+保姆级教程

本文档详细介绍了如何使用 Cursor(AI 编程助手)和 Playwright-MCP 库实现基于 GPT 模型的自动化功能测试。文档从环境搭建开始,逐步指导读者如何通过 Playwright 进行浏览器自动化,并利用 Playwright-MCP 集成 GPT 模型生成测试计划、执行测试步骤及生成测试报告。核心步骤包括安装依赖、配置 OpenAI API 密钥、编写代码实现 AI 驱动的测试流程,以及生成详细的测试报告。通过本文档,读者可以快速掌握从 0 到 1 实现 AI 自主功能测试的全流程。

Dreams°的博客 2891

【状压DP】【NOI2001】炮兵阵地

P2704 题目描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队。一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图。在每一格平原地形上最多可以布置一支炮兵部队(山地上不能够部署炮兵部队);一支炮兵部队在地图上的攻击范围如图中黑色区域所示: 如果在地图中的灰色所标识的平原上部署一支炮兵部队,则图中的黑色的网格表示它...

qq_43398760的博客 317

SolidWorks_模具设计5_分型线生成

分型线是模具设计的核心要素,直接影响产品质量、脱模可行性和制造成本。本文系统介绍了分型线生成技术,包括三种核心算法:基于凸包的方法适用于简单几何,可见性分析处理复杂曲面,曲率特征优化则能找到自然分界。文章提供了完整的Python实现示例,涵盖点云投影、网格处理和分型线评估等关键技术。通过理解这些原理和方法,工程师可以更高效地设计出满足外观要求、易于加工的分型线方案,显著提升模具设计质量和效率。

H17853509096的博客 178

炮兵阵地图文详解NOI2001/POJ1185(状态压缩)

题目描述 司令部的将军们打算在NM的网格地图上部署他们的炮兵部队。一个NM的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图。在每一格平原地形上最多可以布置一支炮兵部队(山地上不能够部署炮兵部队);一支炮兵部队在地图上的攻击范围如图中黑色区域所示: 如果在地图中的灰色所标识的平原上部署一支炮兵部队,则图中的黑色的网格表示它能够攻击到的区域:沿横向左右各两格,沿纵向上下各两格。图上其它白色网格均攻击不到。从图上可见炮兵的攻击范围不受地形的影响。 现在,将军们

hwdn3000的博客 1652

AMD SDP 优快云 系列文章设计

摘要 本文档规划了7篇AMD SDP协议解析系列文章的技术博客设计方案。基于《Scalable Data Port (SDP) Specification》1.5.0版本(122页),面向SoC/NoC领域的RTL设计与验证工程师,构建从基础概念到验证实现的知识体系。 系列文章严格遵循协议规范边界,采用五类证据标签区分内容来源(规范原文、勘误、验证推导等),禁止补充未定义的实现细节。包含端口控制、事务传输、一致性协议等核心内容,最终落实到验证平台设计与覆盖率模型。 每篇文章采用统一模板:明确规范依据、问题导

元直的博客 160

Orange3实战教程:实例---文本分类

我们可以使用预测模型按作者、类型、情感等对文档进行分类。在此工作流中,我们根据文档的Aarne Thompshon Uther索引对文档进行归类,这是故事的主题定义。我们使用两个简单的学习器,Logistic回归和朴素贝叶斯,两者都可以在诺谟图中检查。然后再从可视化分类中添加列线图组件,观察哪些词对逻辑回归最重要。也可以尝试使用在朴素贝叶斯模型上,并编辑连线属性。再从模型中添加朴素贝叶斯模型,以尝试不同的学习器。

err2008的专栏 385

【NOI2001】炮兵阵地

题目描述司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队。一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图。在每一格平原地形上最多可以布置一支炮兵部队(山地上不能够部署炮兵部队);一支炮兵部队在地图上的攻击范围如图中黑色区域所示:如果在地图中的灰色所标识的平原上部署一支炮兵部队,则图中的黑色的网格表示它能够攻击到的区域:沿横向左...

juruo_xlh 397

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

POJ 1185 炮兵阵地

POJ 1185 炮兵阵地 题目链接 Description 司令部的将军们打算在 N∗MN*MN∗M 的网格地图上部署他们的炮兵部队。一个 N∗MN*MN∗M 的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P"表示),如下图。在每一格平原地形上最多可以布置一支炮兵部队(山地上不能够部署炮兵部队);一支炮兵部队在地图上的攻击范围如图中黑色区域所示: 如果在地图中的灰色所标识的平原上部署一支炮兵部队,则图中的黑色的网格表示它能够攻击到的区域:沿横向左右各两格,沿纵向上下各

旺崽的博客 2762

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

poj 1185 炮兵阵地

poj 1185 炮兵阵地 刚刚学习状态压缩,看到这样的问题真的有些不知所措 所以看了大神的题解,得到了这种题的解题思路 这个题的状态就是每一行的炮兵阵地摆放不能相邻,或者仅隔一个位置 找出每一行的状态数最多是sum=60个左右(当列数为10时) 每一行的状态都受起那两行的状态影响,所以不难得出算法的时间复杂度为n*sum^3 /** 初学状态压缩 题目:poj 1185 炮兵阵地 解

mitic的博客 547

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

炮兵阵地 POJ - 1185(状压DP)

G - 炮兵阵地 题目链接:POJ - 1185POJ-3254的升级版;题意:N*M的地图标有H,G, H不能建炮兵阵地, P可以,炮兵阵地之间至少要间距两个格子(POJ-3254是不能相邻);若用1表示有炮兵阵地, 0表示无, 则1001...

Sirius_han的博客 442

【状态dp】poj 1185 炮兵阵地(三维dp)

poj 1185 炮兵阵地http://poj.org/problem?id=1185问题描述:给你一个n行m列的P-H矩阵,H表示不能安置炮兵,1可以安置炮兵,要求炮兵攻击管辖内不能在安置其他炮兵,问最多可安置炮兵的数目思路: 状态压缩+位运算+动态规划基本思路参考上一题http://blog.youkuaiyun.com/u012717411/article/details/488967911.注意与

Hacker_vision 1032

poj1185炮兵阵地【状压dp】

poj1185炮兵阵地 题意: n*m的地图(n<=100, m<=10),有H山地、P平原两种地形,平原上可以部署炮兵。炮兵伤害范围为横竖范围2格并且无视地形,问在保证互不伤害的情况下最多部署几个炮兵。老套路按行转移,炮兵伤害2格,当前行会受到前两行的影响,因此要用到三维,但三维时间空间都炸了。 考虑到炮兵互不伤害,2102^{10}中有很多非法状态,没必要开这么大,预处理出一行的

lh的博客 457

POJ1185炮兵阵地(状压dp)

POJ1185炮兵阵地(状压dp) 学了两周的状压dp,终于把这道题a了… 参考的这篇大佬的博客学习的状压 点这里 题意: 给一个N X M的地图,其中P代表平原能放一个炮兵,H代表一个山不能放炮兵,每个炮兵可以打到上下左右相距为2的距离。问在炮兵互不伤害的情况下地图上最多能放多少个炮兵。(N &lt;= 100,M &lt;= 10) 思路: 看到数据范围和显然这是一道状压dp的题目,首先我们把...

qq_42911793的博客 264

POJ 1185 炮兵阵地 状压dp

题目链接:POJ 1185 炮兵阵地 题目 Description 司令部的将军们打算在NM的网格地图上部署他们的炮兵部队。一个NM的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P"表示),如下图。在每一格平原地形上最多可以布置一支炮兵部队(山地上不能够部署炮兵部队);一支炮兵部队在地图上的攻击范围如图中黑色区域所示: 如果在地图中的灰色所标识的平原上部署一支炮...

weixin_44273380的博客 226

[poj1185]炮兵阵地_状压dp

炮兵阵地 poj-1185     题目大意:给出n列m行,在其中添加炮兵,问最多能加的炮兵数。     注释:n<=100,m<=10。然后只能在平原的地方建立炮兵。       想法:第2到状压dp,++。这题显然是很经典的。设状态dp[i][j][k]表示第i行的状态为j,i-1行的状态为k的最多炮兵数。在转移时,枚举所有的合法炮兵排列(此处的合法数目是根据一行全...

dianan0938的博客 161

【简●解】POJ 1185,LG P2704【炮兵阵地】

POJ 1185,LG P2704【炮兵阵地】 状压经典入门。 【传送门】 POJ 1185 洛谷 P2704 【题目大意】 司令部的将军们打算在 \(N\times M\) 的网格地图上部署他们的炮兵部队。一个 \(N\times M\) 的地图由 \(N\) 行 \(M\) 列组成,地图的每一格可能是山地(用 H 表示),也可能是平原(用 P 表示),如下图。在每一格平原地形上最多可以布...

weixin_30527551的博客 95

[POJ1185]炮兵阵地

[POJ1185]炮兵阵地 试题描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队。一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P"表示),如下图。在每一格平原地形上最多可以布置一支炮兵部队(山地上不能够部署炮兵部队);一支炮兵部队在地图上的攻击范围如图中黑色区域所示: 如果在地图中的灰色所标识的平原上部署一支炮兵部队,则...

weixin_30915275的博客 113
上一篇: UVA 12034-Race
下一篇: InputStreamReader和BufferedReader用法及真实案例
Yuric
博客等级 码龄12年 0粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值