hdu4539 郑厂长系列故事——排兵布阵 + POJ1158 炮兵阵地
题意:
郑厂长系列故事——排兵布阵
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 1883 Accepted Submission(s): 686
Problem Description
郑厂长不是正厂长
也不是副厂长
他根本就不是厂长
事实上
他是带兵打仗的团长
一天,郑厂长带着他的军队来到了一个n*m的平原准备布阵。
根据以往的战斗经验,每个士兵可以攻击到并且只能攻击到与之曼哈顿距离为2的位置以及士兵本身所在的位置。当然,一个士兵不能站在另外一个士兵所能攻击到的位置,同时因为地形的原因平原上也不是每一个位置都可以安排士兵。
现在,已知n,m 以及平原阵地的具体地形,请你帮助郑厂长计算该阵地,最多能安排多少个士兵。
Input
输入包含多组测试数据;
每组数据的第一行包含2个整数n和m (n <= 100, m <= 10 ),之间用空格隔开;
接下来的n行,每行m个数,表示n*m的矩形阵地,其中1表示该位置可以安排士兵,0表示该地形不允许安排士兵。
Output
请为每组数据计算并输出最多能安排的士兵数量,每组数据输出一行。
Sample Input
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
Sample Output
2
思路:
说好了状态压缩dp的,自己dp写着特别费劲,写了一个,结果超时了,然后果断换思路,后来感觉可以直接求最大独立集,因为不能抽象能二分图,所以如果想求独立集,那么就只剩下一个比较暴力的np问题了,就是最大团,虽说是np问题,但是可以靠一些很实用的剪纸和简单dp来优化,这个题目还是轻松的过掉了,建图的时候把不冲突的两个点连接起来,最后一遍最大团就行了。同样的还有POJ1185 炮兵阵地,只是建图的时候的限制不一样而已,别的都一样,具体看代码,明明是在学习dp,怎么又写图论了。
#include<stdio.h>
#include<string.h>
#define N 1100
typedef struct
{
int x ,y;
}NODE;
NODE node[N];
int map[N][N] ,n;
int dp[N] ,now[N];
int Ans;
void DFS(int s ,int sum)
{
if(Ans < sum) Ans = sum;
int tnow[N] ,able = 0;
for(int i = s + 1 ;i <= n ;i ++)
{
tnow[i] = now[i];
if(now[i]) able ++;
}
if(able + sum < Ans) return;
for(int i = s + 1 ;i <= n ;i ++)
{
if(!tnow[i]) continue;
if(sum + dp[i] <= Ans) return;
for(int j = s+1 ;j <= n ;j ++)
now[j] = tnow[j] & map[i][j];
DFS(i ,sum + 1);
}
}
int Max_Tuan()
{
dp[n] = Ans = 1;
for(int i = n - 1 ;i >= 1 ;i --)
{
for(int j = 1 ;j <= n ;j ++)
now[j] = map[i][j];
now[i] = 1;
DFS(i ,1);
dp[i] = Ans;
}
return Ans;
}
int abss(int x)
{
return x > 0 ? x : -x;
}
int ok(int a ,int b)
{
int dis = abss(node[a].x - node[b].x) + abss(node[a].y - node[b].y);
if(dis == 2) return 0;
return 1;
}
int main ()
{
int nn ,mm ,i ,j ,a;
while(~scanf("%d %d" ,&nn ,&mm))
{
int nowid = 0;
for(i = 1 ;i <= nn ;i ++)
for(j = 1 ;j <= mm ;j ++)
{
scanf("%d" ,&a);
if(!a) continue;
nowid ++;
node[nowid].x = i ,node[nowid].y = j;
}
if(!nowid)
{
printf("0\n");
continue;
}
memset(map ,0 ,sizeof(map));
for(i = 1 ;i <= nowid ;i ++)
for(j = i + 1 ;j <= nowid ;j ++)
map[i][j] = map[j][i] = ok(i ,j);
n = nowid;
printf("%d\n" ,Max_Tuan());
}
return 0;
}
POJ 1185
炮兵阵地
Time Limit: 2000MS Memory Limit: 65536K
Total Submissions: 19703 Accepted: 7610
Description
司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队。一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P"表示),如下图。在每一格平原地形上最多可以布置一支炮兵部队(山地上不能够部署炮兵部队);一支炮兵部队在地图上的攻击范围如图中黑色区域所示:
如果在地图中的灰色所标识的平原上部署一支炮兵部队,则图中的黑色的网格表示它能够攻击到的区域:沿横向左右各两格,沿纵向上下各两格。图上其它白色网格均攻击不到。从图上可见炮兵的攻击范围不受地形的影响。
现在,将军们规划如何部署炮兵部队,在防止误伤的前提下(保证任何两支炮兵部队之间不能互相攻击,即任何一支炮兵部队都不在其他支炮兵部队的攻击范围内),在整个地图区域内最多能够摆放多少我军的炮兵部队。
Input
第一行包含两个由空格分割开的正整数,分别表示N和M;
接下来的N行,每一行含有连续的M个字符('P'或者'H'),中间没有空格。按顺序表示地图中每一行的数据。N <= 100;M <= 10。
Output
仅一行,包含一个整数K,表示最多能摆放的炮兵部队的数量。
Sample Input
5 4
PHPP
PPHH
PPPP
PHPP
PHHP
Sample Output
6
Source
#include<stdio.h>
#include<string.h>
#define N 1100
typedef struct
{
int x ,y;
}NODE;
NODE node[N];
int map[N][N] ,n;
int dp[N] ,now[N];
int Ans;
void DFS(int s ,int sum)
{
if(Ans < sum) Ans = sum;
int tnow[N] ,able = 0;
for(int i = s + 1 ;i <= n ;i ++)
{
tnow[i] = now[i];
if(now[i]) able ++;
}
if(able + sum < Ans) return;
for(int i = s + 1 ;i <= n ;i ++)
{
if(!tnow[i]) continue;
if(sum + dp[i] <= Ans) return;
for(int j = s+1 ;j <= n ;j ++)
now[j] = tnow[j] & map[i][j];
DFS(i ,sum + 1);
}
}
int Max_Tuan()
{
dp[n] = Ans = 1;
for(int i = n - 1 ;i >= 1 ;i --)
{
for(int j = 1 ;j <= n ;j ++)
now[j] = map[i][j];
now[i] = 1;
DFS(i ,1);
dp[i] = Ans;
}
return Ans;
}
int abss(int x)
{
return x > 0 ? x : -x;
}
int ok(int a ,int b)
{
int xx = abss(node[a].x - node[b].x);
int yy = abss(node[a].y - node[b].y);
if(!xx && yy <= 2 || !yy && xx <= 2) return 0;
return 1;
}
int main ()
{
int nn ,mm ,i ,j ,a;
char str[110];
while(~scanf("%d %d" ,&nn ,&mm))
{
int nowid = 0;
for(i = 1 ;i <= nn ;i ++)
{
scanf("%s" ,str);
for(j = 1 ;j <= mm ;j ++)
{
if(str[j-1] != 'P') continue;
nowid ++;
node[nowid].x = i ,node[nowid].y = j;
}
}
if(!nowid)
{
printf("0\n");
continue;
}
memset(map ,0 ,sizeof(map));
for(i = 1 ;i <= nowid ;i ++)
for(j = i + 1 ;j <= nowid ;j ++)
map[i][j] = map[j][i] = ok(i ,j);
n = nowid;
printf("%d\n" ,Max_Tuan());
}
return 0;
}
hdu4539 郑厂长系列故事——排兵布阵 + POJ1158 炮兵阵地的更多相关文章
- HDU-4539郑厂长系列故事——排兵布阵(状态压缩,动态规划)
郑厂长系列故事--排兵布阵 Time Limit : 10000/5000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other) Total ...
- 状态压缩 HDU4539 郑厂长系列故事——排兵布阵
多组n *m 0不能放1可以放 每个士兵可以攻击到并且只能攻击到与之曼哈顿距离为2的位置以及士兵本身所在的位置. #include<stdio.h> #include<algorit ...
- 郑厂长系列故事——排兵布阵 hdu4539(状态压缩DP)
郑厂长系列故事——排兵布阵 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)To ...
- HDU 4539郑厂长系列故事――排兵布阵(状压DP)
HDU 4539 郑厂长系列故事――排兵布阵 基础的状压DP,首先记录先每一行可取的所哟状态(一行里互不冲突的大概160个状态), 直接套了一个4重循环居然没超时我就呵呵了 //#pragma co ...
- HDU 4539 郑厂长系列故事——排兵布阵
http://acm.hdu.edu.cn/showproblem.php?pid=4539 郑厂长系列故事——排兵布阵 Time Limit: 10000/5000 MS (Java/Others) ...
- HDU 4539 郑厂长系列故事——排兵布阵 状压dp
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4539 郑厂长系列故事--排兵布阵 Time Limit: 10000/5000 MS (Java/O ...
- HDU 4539 郑厂长系列故事——排兵布阵 —— 状压DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4539 郑厂长系列故事——排兵布阵 Time Limit: 10000/5000 MS (Java/Ot ...
- POJ 1185 - 炮兵阵地 & HDU 4539 - 郑厂长系列故事——排兵布阵 - [状压DP]
印象中这道题好像我曾经肝过,但是没肝出来,现在肝出来了也挺开心的 题目链接:http://poj.org/problem?id=1185 Time Limit: 2000MS Memory Limit ...
- HDU 4539 郑厂长系列故事――排兵布阵(曼哈顿距离)
这虽然是中文题,然而没看懂,不懂的地方,就是在曼哈顿距离这块,网上搜索了一下,写了个程序,是测试曼哈顿距离的. 曼哈顿距离:两点(x1,y1)(x2,y2)的曼哈顿距离为|x1-x2|+|y1-y2| ...
随机推荐
- 剑指 Offer 62. 圆圈中最后剩下的数字 + 约瑟夫环问题
剑指 Offer 62. 圆圈中最后剩下的数字 Offer_62 题目描述 方法一:使用链表模拟 这种方法是暴力方法,时间复杂度为O(nm),在本题中数据量过大会超时. 方法二:递归方法 packag ...
- go中sync.Cond源码解读
sync.Cond 前言 什么是sync.Cond 看下源码 Wait Signal Broadcast 总结 sync.Cond 前言 本次的代码是基于go version go1.13.15 da ...
- ProBuilder快速原型开发技术 ---模型精细化操作
前面我们讲解了很多ProBuilder功能,但是对于制作一款复杂的模型来说,还远远不够.需要更多的对于模型细节的处理,这就是本篇文章要讲解的"模型精细化操作"技术. 关于PB对于模 ...
- flex布局个人总结
<html> <div class="box1"> <span>1</span> <span>2</span> ...
- RabbitMQ镜像队列集群搭建、与SpringBoot整合
镜像模式 集群模式非常经典的就是Mirror镜像模式,保证100%数据不丢失,在实际工作中也是用的最多的,并且实现集群比较的简单. Mirror镜像队列,目的是为了保证 RabbitMQ 数据的高可靠 ...
- HDU_3949 XOR 【线性基】
一.题目 XOR 二.分析 给定$N$个数,问它的任意子集异或产生的数进行排列,求第K小的数. 构造出线性基$B$后,如果$|B| < N$,那么代表N个数中有一个数是可以由线性基中的其他数异或 ...
- git提交本地文件到远程仓库及参与的项目仓库
1.git提交本地文件到组织 1.先再组织中建立个用于存放文件的仓库建然后复制仓库地址: 2.进入要上传的文件的根目录下右击 git Bash 进入git控制台,我要上传的文件如下: 3.进入后: 1 ...
- P1200_你的飞碟在这儿(JAVA语言)
题目描述 众所周知,在每一个彗星后都有一只UFO.这些UFO时常来收集地球上的忠诚支持者. 不幸的是,他们的飞碟每次出行都只能带上一组支持者.因此,他们要用一种聪明的方案让这些小组提前知道谁会被彗星带 ...
- tips 【总结】
需求 移入a标签把对应的详情显示出来并且根据位置判断,当前详情是否超出父级可视区范围,如果超出就定位的距离方向应该正好在父级可视区范围内 需求分析: 需要用到: offsetLeft 获取外边框到 ...
- BUUCTF 基础CODE REVIEW
1.说明: 题目来自于BUUCTF 的基础部分,内容就如题,是一个代码审计.代码如下: <?php /** * Created by PhpStorm. * User: jinzhao * Da ...