(经典例题) POJ 1185 炮兵阵地
来源:互联网 发布:碧柔防晒知乎 编辑:程序博客网 时间:2024/06/05 00:12
炮兵阵地
Time Limit: 2000MSMemory Limit: 65536KTotal Submissions: 16293Accepted: 6204
Description
司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队。一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P"表示),如下图。在每一格平原地形上最多可以布置一支炮兵部队(山地上不能够部署炮兵部队);一支炮兵部队在地图上的攻击范围如图中黑色区域所示:
如果在地图中的灰色所标识的平原上部署一支炮兵部队,则图中的黑色的网格表示它能够攻击到的区域:沿横向左右各两格,沿纵向上下各两格。图上其它白色网格均攻击不到。从图上可见炮兵的攻击范围不受地形的影响。
现在,将军们规划如何部署炮兵部队,在防止误伤的前提下(保证任何两支炮兵部队之间不能互相攻击,即任何一支炮兵部队都不在其他支炮兵部队的攻击范围内),在整个地图区域内最多能够摆放多少我军的炮兵部队。
如果在地图中的灰色所标识的平原上部署一支炮兵部队,则图中的黑色的网格表示它能够攻击到的区域:沿横向左右各两格,沿纵向上下各两格。图上其它白色网格均攻击不到。从图上可见炮兵的攻击范围不受地形的影响。
现在,将军们规划如何部署炮兵部队,在防止误伤的前提下(保证任何两支炮兵部队之间不能互相攻击,即任何一支炮兵部队都不在其他支炮兵部队的攻击范围内),在整个地图区域内最多能够摆放多少我军的炮兵部队。
Input
第一行包含两个由空格分割开的正整数,分别表示N和M;
接下来的N行,每一行含有连续的M个字符('P'或者'H'),中间没有空格。按顺序表示地图中每一行的数据。N <= 100;M <= 10。
接下来的N行,每一行含有连续的M个字符('P'或者'H'),中间没有空格。按顺序表示地图中每一行的数据。N <= 100;M <= 10。
Output
仅一行,包含一个整数K,表示最多能摆放的炮兵部队的数量。
Sample Input
5 4PHPPPPHHPPPPPHPPPHHP
Sample Output
6
Source
Noi 01
题意:有一个网格,其中有些地方不能放上炮兵,有的地方能放上且仅能放一个炮兵,某个格子放上炮兵后,这个格子以及左边两格,右边两格,上边两格,下边两格,都不能再放炮兵了,问最多能放多少个炮兵
思路:一列最多只有10格,我们dfs一下看最多有多少种放置情况,发现原来只有60种,那么当我们在考虑一行该如何放置炮兵时,其实只需要考虑上一行以及上两行的情况,我们用dp[i][j][k] 表示在第i行的排放炮兵的情况为第j种放置方法,第i-1行的炮兵的情况为第k种放置办法,那么转移方程就是 dp[i][j][k] = min(dp[i-1][s][j])+w[k] , w[k] 为第k种放置情况下排放的炮兵数目,当然要判断一下j和k, s和j ,j和s 是否有冲突,判断i,j,k是在对应的行是否与(H) 有冲突。然后注意第一行的初始化,基本就没什么问题了
代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<stdio.h>
using namespace std;
const int maxn = 1<<11;
int state[maxn];
int dp[110][70][70];
int w[maxn];
int sz , n , m;
char input[20];
int place[110];
bool can[110][70];
bool canPut[maxn][maxn];
void dfs(int cur,int s,int sum)
{
if (cur>=m)
{
w[sz] = sum;
state[sz++] = s;
return;
}
dfs(cur+3 , s+(1<<cur) , sum+1);
dfs(cur+1 , s , sum);
}
void match()
{
for (int i = 1 ; i <= n ; ++i)
{
for (int j = 0 ; j < sz ; ++j)
{
can[i][j] = true;
for (int k = 0 ; k < m ; ++k) if ((place[i]&(1<<k))==0)
{
if (state[j]&(1<<k))
{
can[i][j] = false;
break;
}
}
}
}
}
bool canput(int pre,int s)
{
for (int i = 0 ; i < m ; ++i)
if (pre&(1<<i) && s&(1<<i)) return false;
return true;
}
int main()
{
for (int i = 0 ; i < 60 ; ++i)
can[0][i] = true;
sz = 0;
m = 10;
dfs(0,0,0);
memset(canPut,0,sizeof(canPut));
for (int i = 0 ; i < maxn ; ++i)
for (int j = 0 ; j < maxn ; ++j) if (canput(i,j))
canPut[i][j] = true;
while (scanf("%d%d",&n,&m)==2)
{
sz = 0;
dfs(0,0,0);
memset(place,0,sizeof(place));
for (int i = 1 ; i <= n ; ++i)
{
scanf("%s",input);
for (int j = 0 ; j < m ; ++j) if (input[j]=='P')
place[i] += (1<<j);
}
match();
int ans = 0;
memset(dp,0,sizeof(dp));
for (int i = 0 ; i < sz ; ++i)
{
for (int j = 0 ; j < sz ; ++j) if (can[1][i])
{
dp[1][j][i] = w[i];
ans = max(ans,w[i]);
}
}
for (int i = 2 ; i <= n ; ++i)
{
for (int j = 0 ; j < sz ; ++j) if (can[i-1][j])
for (int k = 0 ; k < sz ; ++k) if (can[i][k] && canPut[state[j]][state[k]])
{
for (int l = 0 ; l < sz ; ++l) if (can[i-2][l] && canPut[state[l]][state[k]] && canPut[state[l]][state[j]])
{
if (dp[i][j][k] < dp[i-1][l][j]+w[k])
dp[i][j][k] = dp[i-1][l][j]+w[k];
}
}
}
for (int i = 0 ; i < sz ; ++i)
for (int j = 0 ; j < sz ; ++j) if (ans < dp[n][i][j])
ans = dp[n][i][j];
printf("%d\n",ans);
}
}
0 0
- (经典例题) POJ 1185 炮兵阵地
- poj 1185 炮兵阵地
- POJ 1185 炮兵阵地
- poj 1185炮兵阵地
- poj 1185 炮兵阵地
- poj 1185 炮兵阵地
- poj 1185 炮兵阵地
- poj 1185 炮兵阵地
- POJ-1185-炮兵阵地
- POJ 1185 炮兵阵地
- poj 1185 炮兵阵地
- POJ 1185 炮兵阵地
- poj 1185炮兵阵地
- poj 1185 炮兵阵地
- poj 1185 炮兵阵地
- POJ 1185 炮兵阵地
- POJ 1185 炮兵阵地
- poj 1185 炮兵阵地
- HDU 2110 Crisis of HDU 母函数
- 概率dp POJ 2151 Check the difficulty of problems
- (简单) 树形dp+概率 POJ 3071 Football
- (简单) 状态压缩dp HOJ 2188 WordStack
- (简单) 状态压缩dp HOJ 2665 Factory of XiaoE
- (经典例题) POJ 1185 炮兵阵地
- (简单) 状态压缩dp HOJ 2421 Hie with the Pie
- OpenSessionInView词条
- (中等) 状态压缩dp HOJ 1894 Islands and Bridges
- (简单) dp HOJ 2091 Chess
- (简单) 博弈 HOJ 2128 S-Nim
- (中等) 最短路 HOJ 2132 Easter holidays
- Android之菜单一——选项菜单
- (中等) 动态规划 HOJ 2177 ICPC Strikes Again
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
村民7分钟救出4命
村民7分钟救出4人
超级小村民全文王逸动
村淘
村淘什么意思
村淘跟一般淘宝区别
村淘怎么取消
乐村淘
加入村淘条件和费用
乐村淘商城
村淘是什么意思
淘宝村淘是什么意思
淘宝村淘
蜜淘
淘号
淘粒
淘来淘去网
淘派
哈哈淘
唔淘
淘下载
街街淘
海淘 一淘
一淘网 海淘
一淘海淘
淘虹
hai360海淘
albeebaby 海淘
海淘\'
烟村
植美村黄金烟酰胺精华液
烟村四五家全诗
暧暧远人村依依墟里烟
烟村四五家
上烟村
村田厨卫电器排名
村田制作所垄断的原因
村田制作所
村田油烟机
万界建村令
村舍