poj1185炮兵阵地
- #include <iostream>
- #include <cstdio>
- #include <cmath>
- #include <algorithm>
- #include <string.h>
- #include <string>
- using namespace std;
- const int MAXN = 100 + 1; //阵地行数
- const int MAXM = 10 + 1; //阵地列数
- const int State_Num = 60 + 1; //阵地列状态的压缩总数,合法状态总数最多60
- int dp[MAXN][State_Num][State_Num], cur[MAXN], state[State_Num], tot;
- char field[MAXN][MAXM]; //储存阵地
- int n, m; //阵地规模
- /*
- 因为n <= 100, m <= 10,将阵地的列压缩。
- dp[i][j][k]表示当第i行布置结束后,第i行的布置状态为j的情况下,
- 第i - 1行的状态为k,所能布置的最多的炮兵。
- 依据题意,我们能够删除一些状态。
- 删除的状态有:
- 1.山地不能布置炮兵
- 2.炮兵不能在垂直和水平的线上两格相邻。
- cur[]数组用于储存输入的合法局面
- state[]数组用于储存相邻的合法局面
- */
- bool ok(int x)
- {
- return !((x & (x << 1)) || (x & (x << 2)));
- }
- void init() //保留不两格相邻的
- {
- int limit = (1 << m);
- tot = 0;
- for (int i = 0; i < limit; i++)
- {
- if (ok(i)) state[tot++] = i;
- }
- }
- bool yes(int x, int i)
- {
- return !(x & cur[i]);
- }
- int cal(int x)
- {
- int res = 0;
- while (x)
- {
- if (x & 1) res++;
- x >>= 1;
- }
- return res;
- }
- void input()
- {
- while (scanf("%d %d", &n, &m) != EOF) //输入
- {
- init();
- memset(dp, 0, sizeof(dp));
- for (int i = 0; i < n; i++)
- {
- scanf("%s", field[i]), cur[i] = 0;
- for (int j = 0; j < m; j++)
- if (field[i][j] == 'H') cur[i] += (1 << (m - j - 1)); //用于推断状态是否合法(1)
- }
- for (int i = 0; i < tot; i++) //初始化第一行
- {
- if (!yes(state[i], 0)) continue;
- for (int j = 0; j < tot; j++)
- {
- dp[0][i][j] = cal(state[i]);
- }
- }
- for (int i = 1; i < n; i++) //计算当前行,枚举上两行的状态
- {
- for (int j = 0; j < tot; j++) //枚举当前行的状态
- {
- if (!yes(state[j], i)) continue;
- for (int k = 0; k < tot; k++)
- {
- if (!yes(state[k], i - 1)) continue;
- for (int l = 0; l < tot; l++)
- {
- if (!yes(state[l], i - 2)) continue;
- if (((state[j] & state[k]) == 0) && ((state[j] & state[l]) == 0) && ((state[k] & state[l]) == 0))
- {
- dp[i][j][k] = max(dp[i][j][k], dp[i - 1][k][l] + cal(state[j]));
- }
- }
- }
- }
- }
- int ans = 0; //计算答案
- for (int i = 0; i < tot; i++)
- for (int j = 0; j < tot; j++)
- ans = max(ans, dp[n - 1][i][j]);
- cout << ans << endl;
- }
- }
- int main()
- {
- input();
- return 0;
- }
poj1185炮兵阵地的更多相关文章
- [poj1185]炮兵阵地_状压dp
炮兵阵地 poj-1185 题目大意:给出n列m行,在其中添加炮兵,问最多能加的炮兵数. 注释:n<=100,m<=10.然后只能在平原的地方建立炮兵. 想法:第2到状压dp,++.这题显 ...
- POJ1185炮兵阵地【动态规划】
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 26892 Accepted: 10396 Descriptio ...
- poj1185 炮兵阵地【状压DP】
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 32802 Accepted: 12650 Descriptio ...
- POJ1185 炮兵阵地 —— 状压DP
题目链接:http://poj.org/problem?id=1185 炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions ...
- POJ1185 炮兵阵地 和 POJ2411 Mondriaan's Dream
炮兵阵地 Language:Default 炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 34008 Accepted ...
- POJ1185 炮兵阵地
题目描述 Description 司令部的将军们打算在N × M的网格地图上部署他们的炮兵部队.一个N × M的地图由N行M列组成,地图的每一格可能是山地(用"H"表示),也可能是 ...
- POJ1185 - 炮兵阵地(状态压缩DP)
题目大意 中文的..直接搬过来... 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平 ...
- POJ1185 炮兵阵地 状态压缩
因为不知道不同的博客怎么转,就把别人的复制过来了,这个题解写的非常好,原地址为: http://hi.baidu.com/wangxustf/item/9138f80ce2292b8903ce1bc7 ...
- poj1185炮兵阵地 正确代码及错误代码分析
Solution:状态压缩 因为设置炮兵的局限性(同行两炮兵相差要大于2),一行10个数最多有60种可能性(程序计算) 其中判断可能性的好方法是: if ((i & (i << 1 ...
随机推荐
- TCP_NODELAY详解
在网络拥塞控制领域,我们知道有一个非常有名的算法叫做Nagle算法(Nagle algorithm),这是使用它的发明人John Nagle的名字来命名的,John Nagle在1984年首次用这个算 ...
- 强算KMeans聚类算法演示器
这些天做C#实验以及这个KMeans算法演示器,学了一下openGL,感觉有待加强. //Point.h /* Point 结构体定义及实现 结构体重载了2个运算符: 1.== //推断两个Point ...
- c/c++使用VS2013连接MySQL与ubuntu下c链接mysql
vs连接数据库事实上就是将mysql数据库.h头文件接口.lib链接文件和dll运行文件增加到项目中.以下是配置怎样增加. 转于http://www.cnblogs.com/justinzhang/a ...
- 王垠:Lisp 已死,Lisp 万岁!
王垠:Lisp 已死,Lisp 万岁!_IT新闻_博客园 王垠:Lisp 已死,Lisp 万岁!
- 关于java中的事件类型
java中的Date是为了证明:天才的程序员也会犯错: java中的Calendar是为了证明:普通的程序员也会犯错. ———————————————————— stackoverflow上大部分都推 ...
- AdaBoost中利用Haar特征进行人脸识别算法分析与总结1——Haar特征与积分图
原地址:http://blog.csdn.net/watkinsong/article/details/7631241 目前因为做人脸识别的一个小项目,用到了AdaBoost的人脸识别算法,因为在网上 ...
- VCL改变主窗体的方法
使用如下语句即可Pointer((@Application.MainForm)^) := Form1; 仔细想想和Pointer((Application.MainForm)) := Form1;有什 ...
- jsoncpp使用
第一个github网站下载jsoncpp最新的版本库:https://github.com/open-source-parsers/jsoncpp 点击右下角的Download ZIP进行下载 解压后 ...
- libevent安装总结 - jinfg2008的专栏 - 博客频道 - CSDN.NET
libevent安装总结 - jinfg2008的专栏 - 博客频道 - CSDN.NET libevent安装总结 分类: linux 系统配置 2013-02-13 22:37 99人阅读 评论( ...
- 在java代码中进行px与dip(dp)、px与sp单位值的转换
其实都是以前保存的代码,最近发现自己的资料库很混乱,索性都整理成博客,方便以后自己要用的时候快速找到. DisplayUtil.java /** * 单位转换工具 * * @author ca ...