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.
View Code
分析:按行处理。每一行的状态可以用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
相关文章推荐
- Slides - 在线制作效果精美的幻灯片(PPT)
- 209.Minimum Size Subarray Sum
- ZgiBee 手持机
- Oracle数据完整性学习笔记
- What is Complex Event Processing? (Part 5)
- 聊聊HTTPS与Android安全
- VisualSvn server 权限配置
- shiro权限项目中的简单应用
- 正则表达式
- 渲云客户端之单帧多机
- Android性能优化典范
- cocos2dx_lua 2.x 版本 与 3.x 版本 区别 总结
- SVN合并(merge),从trunk开发分支到beta测试分支
- lua协程的使用列子分析
- JavaScript中地理位置API的使用
- 如何制作HALCON标定靶
- 放到登陆页
- 受众定向-受众定向概念
- MySQL优化之COUNT(*)效率
- mysql权限审核2