这虽然是中文题,然而没看懂,不懂的地方,就是在曼哈顿距离这块,网上搜索了一下,写了个程序,是测试曼哈顿距离的。

曼哈顿距离:两点(x1,y1)(x2,y2)的曼哈顿距离为|x1-x2|+|y1-y2|

测试代码:

#include <map>
#include <set>
#include <list>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <cstdio>
#include <string>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; const int INF=0x3f3f3f3f;
typedef long long ll;
typedef unsigned long long ull;
#define fi first
#define se second
#define prN printf("\n")
#define SI(N) scanf("%d",&(N))
#define SII(N,M) scanf("%d%d",&(N),&(M))
#define SIII(N,M,K) scanf("%d%d%d",&(N),&(M),&(K))
#define cle(a,val) memset(a,(val),sizeof(a))
#define rep(i,b) for(int i=0;i<(b);i++)
#define Rep(i,a,b) for(int i=(a);i<=(b);i++) char tu[60][60];
int a[100][2];
int main()
{
#ifndef ONLINE_JUDGE
// freopen("C:\\Users\\Zmy\\Desktop\\in.txt","r",stdin);
// freopen("C:\\Users\\Zmy\\Desktop\\out.txt","w",stdout);
#endif // ONLINE_JUDGE int i=2,i1=3;
int p=0;
rep(j,6)
rep(j1,6)
{
if (abs(i-j)+abs(i1-j1)==2)
{
printf("%d %d\n",j,j1);
a[p][0]=j;
a[p++][1]=j1;
}
} // i=2,i1=2;
// rep(j,6)
// rep(j1,6)
// {
// if (abs(i-j)+abs(i1-j1)==2)
// {
// printf("%d %d\n",j,j1);
// a[p][0]=j;
// a[p++][1]=j1;
// }
// } cle(tu,'.');
rep(i,p)
{ tu[a[i][0]][a[i][1]]='*';
} rep(i,6)
{
rep(j,6)
{
printf("%c ",tu[i][j]);
}
prN;
} return 0;
}

这是根据测试样例的背景写的,i,i1是所给坐标,最后输出*的地方,就是他对应的曼哈顿距离 (由图可知:曼哈顿距离就是以这个点为中心的菱形)

AC代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define N 110
#define M 200 using namespace std; int n,m,a[N];
int dp[N][M][M],cnt,num[M],sum[M];
///dp[i][j][k] 表示第i行的j状态 i-1行的k状态 的最优解 bool ok(int x)
{
return (x&(x<<2))||(x&(x<<2));///第x-2个和x+2个位是否有人,
// 有的话就不符合条件
} int getsum(int x) ///1的个数,即放多少个兵
{
int sum=0;
while(x)
{
if(x&1)sum++;
x>>=1;
}
return sum;
} void init()
{
cnt=0;
for(int i=0; i<(1<<m); i++) ///预处理,压缩
{
if(!ok(i))
{
num[cnt]=i;
sum[cnt++]=getsum(i);
}
}
}
////二进制函数
//int two[100];
//void o_two(int n)
//{
// memset(two,0,sizeof(two));
// int p=1;
// while(n)
// {
// two[p++]=n%2;
// n/=2;
// }
// printf("Two:");
// for (int i=12;i>=1;i--)
// {
// if (i%4==0)
// printf(" ");
// printf("%d ",two[i]);
// }puts("");
//}
int main()
{
#ifndef ONLINE_JUDGE
freopen("C:\\Users\\Zmy\\Desktop\\in.txt","r",stdin);
// freopen("C:\\Users\\Zmy\\Desktop\\out.txt","w",stdout);
#endif // ONLINE_JUDGE
while(~scanf("%d%d",&n,&m))
{
memset(a,0,sizeof a);
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
int x;
scanf("%d",&x);
if(x)continue;///方便计算,把0存为1
a[i]|=(1<<j);
}
}
// for (int i=0;i<n;i++)
// o_two(a[i]);
init();///初始化了num(情况数组)和sum(个数数组)
memset(dp,0,sizeof dp);
for(int i=0; i<cnt; i++) ///处理第一行
{
if(a[0]&num[i])continue;
dp[0][i][0]=sum[i];
} ///递推,要考虑三行的情况,
for(int i=1; i<n; i++) //第一行
{
for(int j=0; j<cnt; j++)
{
if(a[i]&num[j])continue; ///第一行与原来矩阵有冲突
for(int k=0; k<cnt; k++) ///第二行
{
if(a[i-1]&num[k])continue;
if(((num[k]<<1)&num[j])||((num[k]>>1)&num[j]))continue; //i-1行
int Max=-1;
for(int l=0; l<cnt; l++) ///第三行
{
if(num[j]&num[l])continue;
if(((num[l]<<1)&num[k])||((num[l]>>1)&num[k]))continue;
Max=max(Max,dp[i-1][k][l]);
}
dp[i][j][k]=Max+sum[j];
}
}
}
int Max=-1;
for(int i=0; i<cnt; i++)
for(int j=0; j<cnt; j++)
Max=max(Max,dp[n-1][i][j]);
printf("%d\n",Max);
}
return 0;
}

  

HDU 4539 郑厂长系列故事――排兵布阵(曼哈顿距离)的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. hdu4539 郑厂长系列故事——排兵布阵 + POJ1158 炮兵阵地

    题意:                  郑厂长系列故事--排兵布阵 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/32 ...

  9. [状压dp]HDOJ4539 郑厂长系列故事——排兵布阵

    中文题,题意不再赘述 对于“?”这一格,它所能攻击到的(曼哈顿距离为2的) 前方的 即“√”的四个位置 那么与此格有关的即它前方两行(即状压这两行) 首先预处理每行能满足的: i 和(i<< ...

随机推荐

  1. ThinkPHP缓存微信公众号access_token

    access_token作为微信的全局票据,在高级接口中需要频繁调用,其有效期为7200秒,即2小时,而微信官方对调用Token的次数有限制(参见接口频率限制说明),获取access_token每日限 ...

  2. 黑马程序员——JAVA基础之String和StringBuffer

    ------- android培训.java培训.期待与您交流! ---------- String类: 字符串是一个特殊的对象. 字符串一旦初始化就不可以被改变. String str = &quo ...

  3. #你好Unity3D#Hierarchy视图监听gameObject点击事件

    今天无意间又找到了个好方法     1 2 3 4 5 6 7 8 9 10 [InitializeOnLoadMethod] static void Start () {   Selection.s ...

  4. c# 获取 webbrowser 完整 cookie

    下面的代码实现的功能确实如标题所言,但要求是获取的是当前进程内的webbrowser,跨进程或引用的ShellWindows对象无效, 哎我本来两种情况都要用,只把前者代码先记下: internal ...

  5. 开放平台-web实现人人网第三方登录

    应用场景     web应用通过人人网登录授权实现第三方登录.   操作步骤     1  注册成为人人网开放平台开发者         http://app.renren.com/developer ...

  6. Oracle数据库——索引、视图、序列和同义词的创建

    一.涉及内容 1.理解索引的概念和类型. 2.掌握创建索引的命令. 3.理解视图的概念和优点. 4.理解可更新视图应具备的特点. 5.掌握创建一般视图和可更新视图的命令. 6.理解序列和同义词的概念和 ...

  7. Zookeeper 源码分析-启动

    Zookeeper 源码分析-启动 博客分类: Zookeeper   本文主要介绍了zookeeper启动的过程 运行zkServer.sh start命令可以启动zookeeper.入口的main ...

  8. ie8下table的colspan属性与max-with属性的显示错乱问题

    今天项目测试时发现了一个table的colspan样式问题,发现colspan单元格下的的元素设置max-with后将上面的第二列单元格撑开了,导致后面单元格的内容换行,先看代码: html代码: & ...

  9. maven设置---Dmaven.multiModuleProjectDirectory system propery is not set.

    设置maven 环境变量: MAVEN_HOME:D:\Java\apache-maven-3.3.3 M2_HOME:D:\Java\apache-maven-3.3.3 path:%MAVEN_H ...

  10. 如何进行oracle capability i/o(压力测试数据库服务器i/o性能)

    一 .oracle 有关 IO 信息的相关统计函数 Oracle i/o stack包含hbas,存储相关的交换机.存储物理磁盘.那么oracle建议在应用程序部署的时候,建议去验证i/o避免存在问题 ...