题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=4539

郑厂长系列故事——排兵布阵

Time Limit: 10000/5000 MS (Java/Others)
Memory Limit: 65535/32768 K (Java/Others)
#### 问题描述
> 郑厂长不是正厂长
> 也不是副厂长
> 他根本就不是厂长
> 事实上
> 他是带兵打仗的团长
> 一天,郑厂长带着他的军队来到了一个n*m的平原准备布阵。
> 根据以往的战斗经验,每个士兵可以攻击到并且只能攻击到与之曼哈顿距离为2的位置以及士兵本身所在的位置。当然,一个士兵不能站在另外一个士兵所能攻击到的位置,同时因为地形的原因平原上也不是每一个位置都可以安排士兵。
> 现在,已知n,m 以及平原阵地的具体地形,请你帮助郑厂长计算该阵地,最多能安排多少个士兵。

输入

输入包含多组测试数据;

每组数据的第一行包含2个整数n和m (n <= 100, m <= 10 ),之间用空格隔开;

接下来的n行,每行m个数,表示n*m的矩形阵地,其中1表示该位置可以安排士兵,0表示该地形不允许安排士兵。

输出

请为每组数据计算并输出最多能安排的士兵数量,每组数据输出一行。

样例输入

6 6

0 0 0 0 0 0

0 0 0 0 0 0

0 0 1 1 0 0

0 0 0 0 0 0

0 0 0 0 0 0

0 0 0 0 0 0

样例输出

2

题意

每个点会攻击离它哈密顿距离为2的所有点,以及它自己所在的点,现在给你一个n*m的棋盘,有些点上不能放棋子,问最多能放多少个棋子,且任意两个棋子都不会互相攻击。

题解

dp[cur][i][j]表示第cur-1行状态为i,第cur行状态为j,能装下的最大不冲突棋子数。

做法和[port]差不多

#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<ctime>
#include<vector>
#include<cstdio>
#include<string>
#include<bitset>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
using namespace std;
#define X first
#define Y second
#define mkp make_pair
#define lson (o<<1)
#define rson ((o<<1)|1)
#define mid (l+(r-l)/2)
#define sz() size()
#define pb(v) push_back(v)
#define all(o) (o).begin(),(o).end()
#define clr(a,v) memset(a,v,sizeof(a))
#define bug(a) cout<<#a<<" = "<<a<<endl
#define rep(i,a,b) for(int i=a;i<(b);i++)
#define scf scanf
#define prf printf typedef long long LL;
typedef vector<int> VI;
typedef pair<int,int> PII;
typedef vector<pair<int,int> > VPII; const int INF=0x3f3f3f3f;
const LL INFL=10000000000000000LL;
const double eps=1e-9; const double PI = acos(-1.0); //start---------------------------------------------------------------------- const int maxn=111;
const int maxm=11;
const int maxs=400; LL dp[2][maxs][maxs]; int n,m; ///处理出有效状态
VI sta;
vector<LL> sumv;
void pre(){
for(int i=0;i<(1<<10);i++){
int cnt=0;
bool su=true;
for(int j=0;j<10;j++){
if(!(i&(1<<j))) continue;
cnt++;
if(j-2>=0&&(i&(1<<(j-2)))){ su=false; break; }
}
if(!su) continue;
sta.pb(i);
sumv.pb(cnt);
}
} int tot;
int arr[maxn][maxm]; bool ok(int x,int i){
for(int j=0;j<m;j++){
if(!(x&(1<<j))) continue;
if(arr[i][j]==0) return false;
}
return true;
} bool ok2(int pp,int p,int u){
for(int j=0;j<m;j++){
if(!(u&(1<<j))) continue;
if(j&&(p&(1<<(j-1)))) return false;
if(j<m-1&&(p&(1<<(j+1)))) return false;
if(pp>=0&&(pp&(1<<j))) return false;
}
return true;
} void dealone(){
LL ans=0;
for(int i=0;i<tot;i++){
if(ok(sta[i],0)) ans=max(ans,sumv[i]);
}
prf("%lld\n",ans);
} int main() {
pre();
while(scf("%d%d",&n,&m)==2) {
tot=upper_bound(all(sta),(1<<m)-1)-sta.begin();
// bug(tot); rep(i,0,n) rep(j,0,m){
scf("%d",&arr[i][j]);
} if(n==1){ dealone(); continue; } int cur=0;
clr(dp[cur],0);
for(int i=0;i<tot;i++){
if(!ok(sta[i],0)) continue;
for(int j=0;j<tot;j++){
if(!ok(sta[j],1)) continue;
if(!ok2(-1,sta[i],sta[j])) continue;
dp[cur][i][j]=sumv[i]+sumv[j];
}
} // bug(dp[cur][17][4]); for(int t=2;t<n;t++){
cur^=1;
clr(dp[cur],0);
for(int k=0;k<tot;k++){
if(!ok(sta[k],t)) continue;
for(int j=0;j<tot;j++){
if(!ok(sta[j],t-1)) continue;
if(!ok2(-1,sta[j],sta[k])) continue;
for(int i=0;i<tot;i++){
if(!ok(sta[i],t-2)) continue;
if(!ok2(sta[i],sta[j],sta[k])) continue;
dp[cur][j][k]=max(dp[cur][j][k],dp[cur^1][i][j]+sumv[k]);
}
}
}
} LL ans=0;
for(int i=0;i<tot;i++){
for(int j=0;j<tot;j++){
ans=max(ans,dp[cur][i][j]);
}
} prf("%lld\n",ans); }
return 0;
} //end-----------------------------------------------------------------------

HDU 4539 郑厂长系列故事——排兵布阵 状压dp的更多相关文章

  1. HDU 4539 郑厂长系列故事——排兵布阵 —— 状压DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4539 郑厂长系列故事——排兵布阵 Time Limit: 10000/5000 MS (Java/Ot ...

  2. hdu_4539_郑厂长系列故事——排兵布阵(状压DP|最大团)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4539 题意:中文,不解释 题解:将每一行的状态压缩,然后进行DP,也可以用最大团做.这里我用的DP # ...

  3. HDU 4539郑厂长系列故事――排兵布阵(状压DP)

    HDU 4539  郑厂长系列故事――排兵布阵 基础的状压DP,首先记录先每一行可取的所哟状态(一行里互不冲突的大概160个状态), 直接套了一个4重循环居然没超时我就呵呵了 //#pragma co ...

  4. HDU 4539 郑厂长系列故事——排兵布阵

    http://acm.hdu.edu.cn/showproblem.php?pid=4539 郑厂长系列故事——排兵布阵 Time Limit: 10000/5000 MS (Java/Others) ...

  5. POJ 1185 - 炮兵阵地 & HDU 4539 - 郑厂长系列故事——排兵布阵 - [状压DP]

    印象中这道题好像我曾经肝过,但是没肝出来,现在肝出来了也挺开心的 题目链接:http://poj.org/problem?id=1185 Time Limit: 2000MS Memory Limit ...

  6. HDU 4539 郑厂长系列故事――排兵布阵(曼哈顿距离)

    这虽然是中文题,然而没看懂,不懂的地方,就是在曼哈顿距离这块,网上搜索了一下,写了个程序,是测试曼哈顿距离的. 曼哈顿距离:两点(x1,y1)(x2,y2)的曼哈顿距离为|x1-x2|+|y1-y2| ...

  7. HDU 4529 郑厂长系列故事——N骑士问题 状压dp

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4529 郑厂长系列故事--N骑士问题 Time Limit: 6000/3000 MS (Java/O ...

  8. 郑厂长系列故事——排兵布阵 hdu4539(状态压缩DP)

    郑厂长系列故事——排兵布阵 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)To ...

  9. HDU-4539郑厂长系列故事——排兵布阵(状态压缩,动态规划)

    郑厂长系列故事--排兵布阵 Time Limit : 10000/5000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other) Total ...

随机推荐

  1. 【TOJ 2406】Power Strings(KMP找最多重复子串)

    描述 Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc& ...

  2. ubuntu18.04(bionic) 配置阿里数据源

    先备份源数据原文件 cp sources.list sources.list.bak 编辑 sources.list,输入内容如下: deb http://mirrors.aliyun.com/ubu ...

  3. 大数据入门第九天——MapReduce详解(六)MR其他补充

    一.自定义in/outputFormat 1.需求 现有一些原始日志需要做增强解析处理,流程: 1. 从原始日志文件中读取数据 2. 根据日志中的一个URL字段到外部知识库中获取信息增强到原始日志 3 ...

  4. mfc 类

    知识点 类的概念 类的相关术语 定义类 使用类 一.类的概念 简单的说类就是数据与函数综合体,它是用户自定义类型. 二.类的相关术语 类的实例称为对象. 类在定义中隐式地包含数据和操作函数,这种思想称 ...

  5. python基础学习1-面向对象

    #!/usr/bin/env python # -*- coding:utf-8 -*- class Foo:#定义类 def mail(self,email,message):#定义类的方法 pri ...

  6. re 模块错误 error: bad character range

    下午,看到堆栈的内容.于是上机实验了一番 >>> bds = '10+6/5-4*2' # 数学运算表达式 想用 findall 把运算符号提取出来 >>> imp ...

  7. codevs 2639 约会计划

    codevs 2639 约会计划 题目描述 Description cc是个超级帅哥,口才又好,rp极高(这句话似乎降rp),又非常的幽默,所以很多mm都跟他关系不错.然而,最关键的是,cc能够很好的 ...

  8. 【转载】基于MFC的ActiveX控件开发(1)

    原文:http://iysm.net/?p=114 ActiveX 控件是基于组件对象模型 (COM) 的可重用软件组件,广泛应用于桌面及Web应用中.在VC下ActiveX控件的开发可以分为三种,一 ...

  9. Luogu5110 块速递推

    题面 题解 线性常系数齐次递推sb板子题 $a_n=233a_{n-1}+666a_{n-2}$的特征方程为 $$ x^2=233x+666 \\ x^2-233x+666=0 \\ x_1=\fra ...

  10. 4516: [Sdoi2016]生成魔咒

    4516: [Sdoi2016]生成魔咒 链接 题意: 求本质不同的子串. 分析: 后缀数组或者SAM都可以. 考虑SAM中每个点的可以表示的子串是一个区间min(S)~max(S),把每个点的这个区 ...