首页 > 代码库 > poj 1185 状态压缩
poj 1185 状态压缩
炮兵阵地
Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 27926 | Accepted: 10805 |
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
题意:给你一个m*n的矩阵 每一块 P代表平原 可以安放炮台 现在按照要求部署炮台 任意两个炮台之间的距离应当大于2 问最多能够安放多少个炮台
题解:dp[i][j][l] 代表第i行部署状态为l 第i-1行部署状态位j的情况下的答案
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 #include<map> 7 #include<queue> 8 #include<stack> 9 #include<vector>10 #include<set>11 #define ll __int6412 #define mod 10000000013 using namespace std;14 int n,m;15 int a[70];16 int b[110];17 int dp[110][70][70];18 char w[105][105];19 int cnt=0;20 int bit[70];21 int fin (int x)22 {23 int jishu=0;24 while(x>0)25 {26 if(x%2==1)27 jishu++;28 x/=2;29 }30 return jishu;31 }32 bool check(int x)//判断每一行可行的部署方案33 {34 if(x&(x/2)) return false;35 if(x&(x/4)) return false;36 return true;37 }38 bool fun(int x,int k)//判断是否满足平原的要求39 {40 if(x&b[k]) return false;41 else return true;42 }43 int main()44 {45 scanf("%d %d",&m,&n);46 char exm;47 cnt=0;48 for(int i=0; i<(1<<n); i++){49 if(check(i)){50 a[++cnt]=i;51 bit[cnt]=fin(i);52 }53 }54 memset(b,0,sizeof(b));55 for(int i=1; i<=m; i++)56 scanf("%s",w[i]+1);57 for(int i=1; i<=m; i++)58 for(int j=1; j<=n; j++)59 if(w[i][j]==‘H‘)60 b[i]+=(1<<(n-j));61 memset(dp,-1,sizeof(dp));62 for(int i=1; i<=cnt; i++){63 if(fun(a[i],1))64 dp[1][1][i]=bit[i];65 }66 67 for(int i=2; i<=m; i++){68 for(int k=1; k<=cnt; k++){69 if(!fun(a[k],i)) continue;70 for(int j=1; j<=cnt; j++){71 if(a[k]&a[j]) continue;72 for(int l=1;l<=cnt;l++){73 if(a[k]&a[l]) continue;74 if(dp[i-1][j][l]==-1) continue;75 dp[i][l][k]=max(dp[i][l][k],dp[i-1][j][l]+bit[k]);76 }77 }78 }79 }80 int ans=0;81 for(int i=1;i<=m;i++)82 for(int j=1;j<=cnt;j++)83 for(int l=1;l<=cnt;l++)84 ans=max(ans,dp[i][j][l]);85 printf("%d\n",ans);86 return 0;87 }
poj 1185 状态压缩
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。