炮兵阵地
Time Limit: 2000MS |
|
Memory Limit: 65536K |
Total Submissions: 16155 |
|
Accepted: 6142 |
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
这道题比较经典,是状态压缩的动态规划。。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
int n,m,ii;
char map[102][11];
int dp[102][61][61];
int line[103];
struct state
{
int soldler; //在这种状态下的士兵数
int sta; //将这种二进制状态用十进制表示出来
}state[62];
int Max(int a,int b)
{
return a>b?a:b;
}
void Init(int mm,int num,int n,int a[]) //递归计算一共有多少种状态。。
{
if(mm == m+2)
{
state[ii].soldler = num;
state[ii++].sta = n;
return;
}
if(!a[mm-2] && !a[mm-1] && !a[mm] && !a[mm+1] && !a[mm+2])
{
a[mm] = 1;
Init(mm+1,num+1,n+(int)pow(2.0,mm-2),a);
a[mm] = 0;
Init(mm+1,num,n,a);
}
else
Init(mm+1,num,n,a);
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(map,0,sizeof(map));
memset(state,0,sizeof(state));
ii = 0;
int a[15] = {0};
Init(2,0,0,a);
memset(line,0,sizeof(line));
for(int i=1;i<=n;i++)
{
scanf("%s",map[i]+1);
for(int j=1;j<=m;j++)
if(map[i][j] == 'H')
line[i]+=(int)pow(2.0,j-1);
}
int s,t,r,max=0;
for(s=0;s<ii;s++)
{
if( !(state[s].sta&line[1]) )
{
dp[1][s][ii-1] = state[s].soldler;
max = Max(max,dp[1][s][ii-1]);
}
}
for(s=2;s<=n;s++) //动态规划dp[s][t][r] = num[t] + max{dp[s-1][r][q]}...
for(t=0;t<ii;t++)
for(r=0;r<ii;r++)
{
if( !(state[t].sta & state[r].sta) && !(state[t].sta&line[s]) )
for(int q=0;q<ii;q++)
if( !(state[t].sta & state[q].sta) && !(state[r].sta & state[q].sta) )
{
dp[s][t][r] = Max(dp[s][t][r],state[t].soldler+dp[s-1][r][q]);
}
max = Max(max,dp[s][t][r]);
}
printf("%d\n",max);
}
return 0;
}
分享到:
相关推荐
POJ数据略弱,此数据比POJ数据强,不过没有小数据,查错不是很方便,附AC标程
算法-炮兵阵地(POJ-1185)(包含源程序).rar
放炮问题,北大网站 POJ 1185 算法
POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类
poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题...
POJ第1861题源码 POJ第1861题源码 POJ第1861题源码
poj分类poj分类poj分类poj分类
北大POJ1159-Palindrome 解题报告+AC代码
poj 3414解题报告poj 3414解题报告poj 3414解题报告poj 3414解题报告
C语言 poj npu 西工大 C语言Poj答案全完整打包,给有需要的朋友
poj 1012解题报告poj 1012解题报告poj 1012解题报告poj 1012解题报告
poj 2329解题报告poj 2329解题报告poj 2329解题报告poj 2329解题报告
poj 1659解题报告poj 1659解题报告poj 1659解题报告poj 1659解题报告
POJ1503解答 POJ1503解答,正确答案(已通过POJ)
北大POJ2002-Squares 解题报告+AC代码
POJ1048,加强版的约瑟夫问题 难度中等
POJ1083的代码,POJ1083的代码,POJ1083的代码
poj 百练 题目分类 poj 百练 题目分类
poj 1001答案
POJ2968代码有用,欢迎下载,POJ代码