hdu 4539 郑厂长系列故事——排兵布阵(状态压缩)
来源:互联网 发布:视频放大镜软件 编辑:程序博客网 时间:2024/05/17 08:52
Problem Description
郑厂长不是正厂长
也不是副厂长
他根本就不是厂长
事实上
他是带兵打仗的团长
一天,郑厂长带着他的军队来到了一个n*m的平原准备布阵。
根据以往的战斗经验,每个士兵可以攻击到并且只能攻击到与之曼哈顿距离为2的位置以及士兵本身所在的位置。当然,一个士兵不能站在另外一个士兵所能攻击到的位置,同时因为地形的原因平原上也不是每一个位置都可以安排士兵。
现在,已知n,m 以及平原阵地的具体地形,请你帮助郑厂长计算该阵地,最多能安排多少个士兵。
也不是副厂长
他根本就不是厂长
事实上
他是带兵打仗的团长
一天,郑厂长带着他的军队来到了一个n*m的平原准备布阵。
根据以往的战斗经验,每个士兵可以攻击到并且只能攻击到与之曼哈顿距离为2的位置以及士兵本身所在的位置。当然,一个士兵不能站在另外一个士兵所能攻击到的位置,同时因为地形的原因平原上也不是每一个位置都可以安排士兵。
现在,已知n,m 以及平原阵地的具体地形,请你帮助郑厂长计算该阵地,最多能安排多少个士兵。
Input
输入包含多组测试数据;
每组数据的第一行包含2个整数n和m (n <= 100, m <= 10 ),之间用空格隔开;
接下来的n行,每行m个数,表示n*m的矩形阵地,其中1表示该位置可以安排士兵,0表示该地形不允许安排士兵。
每组数据的第一行包含2个整数n和m (n <= 100, m <= 10 ),之间用空格隔开;
接下来的n行,每行m个数,表示n*m的矩形阵地,其中1表示该位置可以安排士兵,0表示该地形不允许安排士兵。
Output
请为每组数据计算并输出最多能安排的士兵数量,每组数据输出一行。
Sample Input
6 60 0 0 0 0 00 0 0 0 0 00 0 1 1 0 00 0 0 0 0 00 0 0 0 0 00 0 0 0 0 0
Sample Output
2
Source
2013腾讯编程马拉松复赛第二场(3月30日)
Recommend
liuyiding | We have carefully selected several similar problems for you: 5932 5931 5930 5929 5928
思路:因为由于三行之间存在关系,我们需要开三维来进行压缩状态DP;也要注意内存的优化
代码:
#include<cstdio>#include<algorithm>#include<cstring>using namespace std;const int N=202;int map[101][N],c[N];int vis[N],mag[N];int dp[101][N][N];int find(int x){ int ans=0; while(x) { if(x&1) ans++; x=x>>1; } return ans;}int main(){ int n,m; while(~scanf("%d%d",&n,&m)) { for(int i=0;i<n;i++) { int tem=0; for(int j=0;j<m;j++) { scanf("%d",&map[i][j]); if(!map[i][j]) tem|=1<<j; } c[i]=tem; } int len=0; for(int i=0;i<(1<<m);i++) { if((i&(i<<2))==0) { vis[len]=i; mag[len++]=find(i); } } memset(dp,-1,sizeof(dp)); for(int i=0;i<len;i++) { if(c[0]&vis[i]) continue; dp[0][i][0]=mag[i]; } for(int i=1;i<n;i++) { for(int j=0;j<len;j++) { if(c[i]&vis[j]) continue; for(int k=0;k<len;k++) { if((((vis[k]<<1)&vis[j]))||(((vis[k]>>1)&vis[j]))) continue; for(int l=0;l<len;l++) { if((vis[l]>>1)&vis[k]) continue; if((vis[l]<<1)&vis[k]) continue; if(vis[l]&vis[j]) continue; if(dp[i-1][k][l]==-1) continue; dp[i][j][k]=max(dp[i][j][k],dp[i-1][k][l]+mag[j]); } } } } int s=0; for(int i=0;i<len;i++) for(int j=0;j<len;j++) { s=max(s,dp[n-1][i][j]); } printf("%d\n",s); }}
0 0
- 状态压缩dp hdu 4539 郑厂长系列故事——排兵布阵
- hdu 4539 郑厂长系列故事——排兵布阵(状态压缩DP)
- hdu 4539 郑厂长系列故事——排兵布阵 (状态压缩dp)
- 状态压缩(1) Hdu 4539 郑厂长系列故事——排兵布阵
- hdu 4539 郑厂长系列故事——排兵布阵 状态压缩dp
- hdu 4539 郑厂长系列故事——排兵布阵(状态压缩dp)
- hdu 4539 郑厂长系列故事——排兵布阵 状态压缩+dp;
- hdu 4539 郑厂长系列故事——排兵布阵 (状态压缩dp)
- HDU 4539 郑厂长系列故事——排兵布阵(状态压缩dp)
- HDU 4539 郑厂长系列故事——排兵布阵 (状态压缩DP)
- Hdu 4539 郑厂长系列故事——排兵布阵 状态压缩
- HDU ACM 4539 郑厂长系列故事——排兵布阵->状态压缩DP
- HDU-4539郑厂长系列故事——排兵布阵(状态压缩,动态规划)
- 【状态压缩DP】 HDU 4539 郑厂长系列故事——排兵布阵
- hdu 4539 郑厂长系列故事——排兵布阵(状态压缩)
- hdu 4539 郑厂长系列故事——排兵布阵(状态压缩dp)
- (待解决) hdu HDU4539 郑厂长系列故事——排兵布阵 (状态压缩dp~)
- HDOJ 4539 郑厂长系列故事——排兵布阵(状态压缩dp)
- Redis 详解 (一) StackExchange.Redis Client
- drbd详解
- bootstrap 3 中文文档
- ASP.NET Redis 开发
- .NET基于Redis缓存实现单点登录SSO的解决方案
- hdu 4539 郑厂长系列故事——排兵布阵(状态压缩)
- mssql将字符串拆分为数组
- vs2012扩展插件大合集(亲自试验,持续更新中...)
- Gdevops 敏捷运维峰会上海站 年度的收官之作
- 压力测试的轻量级具体做法
- 简单的asp.net自定义控件
- 使用webservice返回xml格式数据使用jq解析
- 一个线程的独白
- 将一个实体类赋值到另一个实体类