您的位置:首页 > 其它

POJ1185 炮兵阵地

2015-06-30 11:48 204 查看
题目大意:在一块N*M的区域内,P为平原,H为山地。平原可以放炮兵部队,山地不可以。每支炮兵部队可能会误伤同行或同列【-2,+2】区间内的友军。在保证不误伤的前提下,问该区域最多可以布置多少炮兵。N<=100,M<10

分析:按行处理。每一行的状态可以用dfs处理出来,保存在数组中。

f[i][j][k]=∑(f[[i-1][k][p])

f[i][j][k]表示第i行的状态为j且上一行的状态为k时最多能布置的炮兵数。

j与k不能冲突,j与p也不能冲突,k与p不能冲突。f初始值为0.

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<cstring>
using namespace std;
#define MAXN 105
int f[MAXN][MAXN][MAXN],n,m,state[MAXN][MAXN],row,cnt,cnts[MAXN][MAXN],nums[MAXN],num;
char arr[MAXN][MAXN];
void dfs(int j,int sta,int cnt)
{
if(j>m)
{
state[row][num++]=sta;
cnts[row][num-1]=cnt;
nums[row]=num;
return;
}
if((sta&3)==0&&arr[row][j]=='P')
dfs(j+1,(sta<<1)+1,cnt+1);
dfs(j+1,(sta<<1),cnt);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{scanf("%s",arr[i]+1);
row=i;
num=0;
dfs(1,0,0);
}
memset(f,0,sizeof f);
for(int i=0;i<nums[1];i++)
f[1][i][0]=cnts[1][i];
nums[0]=1;
for(int i=2;i<=n;i++)
for(int j=0;j<nums[i];j++)
for(int k=0;k<nums[i-1];k++)
if((state[i][j]&state[i-1][k])==0)
{
for(int q=0;q<nums[i-2];q++)
{
if((state[i-1][k]&state[i-2][q])==0&&(state[i][j]&state[i-2][q])==0)
if(f[i][j][k]<f[i-1][k][q]+cnts[i][j])
f[i][j][k]=f[i-1][k][q]+cnts[i][j];
}
}
long long ans=0;
for(int i=0;i<nums
;i++)
for(int j=0;j<nums[n-1];j++)
if(ans<f
[i][j])
ans=f
[i][j];
printf("%I64d\n",ans);


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: