poj 1185 炮兵阵地(三维状态压缩dP)
题目:http://poj.org/problem?id=1185
思路:
d[i][j][k]表示第i行的状态为第k个状态,第i-1行的状态为第j个状态的时候 的炮的数量。
1表示放大炮, 地形状态中1表示山地。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;
#define max(a, b) (a) > (b)?(a):(b) int cnt, c[], m, n;
char map[][], num[];
int d[][][], cur[];
bool ok(int x) //判断一行中,是否合法
{
if(x&(x<<)) return false;
if(x&(x<<)) return false;
return true;
}
void init() //初始计算这n个 有多少种合法的状态
{
int i;
cnt = ;
for(i = ; i < (<<n); i++)
if(ok(i))
c[++cnt] = i;
}
bool fit(int x, int k) //判断当前行的状态是否与 地形合法
{
if(cur[k]&x) return false;
return true;
}
int cal(int x)
{
int sum = ;
while(x)
{
sum++;
x = (x&(x-)); //计算一行中1的个数,相当于每次都减去1个1
}
return sum;
}
int main()
{
int i, j, k, t, ans;
while(~scanf("%d%d", &m, &n))
{
if(n== && m==)
break;
init();
for(i = ; i <= m; i++)
scanf("%s", map[i]);
for(i = ; i <= m; i++)
{
cur[i] = ;
for(j = ; j < n; j++)
{
if(map[i][j]=='H')
cur[i] += ;
if(j != n-)
cur[i] = (cur[i]<<);
}
}
memset(d, -, sizeof(d)); for(i = ; i <= cnt; i++) //初始第1行
{
num[i] = cal(c[i]);
if(fit(c[i], ))
d[][][i] = num[i];
}
for(i = ; i <= m; i++)
for(t = ; t <= cnt; t++)
{
if(!fit(c[t], i))
continue;
for(j = ; j <= cnt; j++)
{
if(c[t]&c[j]) continue; //判断与上上行合法
for(k = ; k <= cnt; k++)
{
if(c[t]&c[k]) continue; //判断与上行合法
if(d[i-][j][k]==-) continue;
d[i][k][t] = max(d[i][k][t], d[i-][j][k]+num[t]);
}
}
} ans = ;
for(i = ; i <= m; i++)
for(j = ; j <= cnt; j++)
for(k = ; k <= cnt; k++)
ans = max(ans, d[i][j][k]);
printf("%d\n", ans);
}
return ;
}
poj 1185 炮兵阵地(三维状态压缩dP)的更多相关文章
- POJ 1185 炮兵阵地 (状态压缩DP)
题目链接 Description 司令部的将军们打算在NM的网格地图上部署他们的炮兵部队.一个NM的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用& ...
- poj 1185 炮兵阵地 [经典状态压缩DP]
题意:略. 思路:由于每个大炮射程为2,所以如果对每一行状态压缩的话,能对它造成影响的就是上面的两行. 这里用dp[row][state1][state2]表示第row行状态为state2,第row- ...
- POJ 1185 炮兵阵地(状态压缩DP)
题解:nState为状态数,state数组为可能的状态 代码: #include <map> #include <set> #include <list> #inc ...
- luogu P2704 炮兵阵地(经典状态压缩DP)
方格有m*n个格子,一共有2^(m+n)种排列,很显然不能使用暴力法,因而选用动态规划求解. 求解DP问题一般有3步,即定义出一个状态 求出状态转移方程 再用算法实现.多数DP题难youguan点在于 ...
- POJ 1185 炮兵阵地(状压DP)
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 26426 Accepted: 10185 Descriptio ...
- POJ1185炮兵阵地(状态压缩DP)
POJ飞翔.数据弱 ZQOJ飞翔 数据强 Description 司令部的将军们打算在N×M的网格地图上部署他们的炮兵部队.一个N×M的地图由N行M列组成,地图的每一格可能是山地(用"H&q ...
- poj -1185 炮兵阵地 (经典状压dp)
http://poj.org/problem?id=1185 参考博客:http://poj.org/problem?id=1185 大神博客已经讲的很清楚了,注意存状态的时候是从1开始的,所以初始化 ...
- 洛谷 P2704 [NOI2001]炮兵阵地 (状态压缩DP+优化)
题目描述 司令部的将军们打算在NM的网格地图上部署他们的炮兵部队.一个NM的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P" ...
- POJ 1185 炮兵阵地 【状压DP】
<题目链接> 题目大意: 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平 ...
随机推荐
- css的display属性小实验
div与span是常用的盒子模型; 区别: div默认是垂直分布(独占一行) span默认是水平分布(一行可以有多个) 通过float属性可以改变div容器的分布方式达到span容器的效果; 下面 ...
- C#基础原理拾遗——面试都爱问的委托和事件(纠正)
这篇博客是我昨天写的,文中的观点有些问题,后经过网友留言和个人学习发现错误,原文还是保留,更改补在后面,不怕贻笑大方,唯恐误人子弟.不知道还能不能放在首页,让被误导的同学再被反误导一次. 一.原文 几 ...
- XML学习总结
什么是XML?XML指可扩展标记语言(EXtendsible Markup Language) XML的设计宗旨是传输数据,而不是显示数据. XML标签没有被预定义(html是预定义),XML里面您需 ...
- HTML弹出窗口
1.最简单的 <script type="text/javascript"> <!-- window.open("http://cn.bing.com& ...
- Codeforces Gym 100342J Problem J. Triatrip 三元环
题目链接: http://codeforces.com/gym/100342 题意: 求三元环的个数 题解: 用bitset分别统计每个点的出度的边和入度的边. 枚举每一条边(a,b),计算以b为出度 ...
- Ext学习-前后交互模式介绍
在前后台交互模式的介绍中,实际上就是Store中Proxy相关的内容,比如Ajax提交. 所以详细的文档请参考: Ext学习-基础概念,核心思想介绍 中关于数据模型和MVC结构部分. 作者:sdj ...
- Enabled AWE
sp_configure RECONFIGURE GO sp_configure RECONFIGURE GO sp_configure RECONFIGURE GO sp_configure REC ...
- uva 514
栈的简单应用 /************************************************************************* > Author: xlc28 ...
- Kafka之Purgatory Redesign Proposal (翻译)
Purgatory是Kafka server中处理请求时使用的一个重要的数据结构.正好研究ReplicaManager源码的时候发现了这篇文章,顺便翻译下.由于这个proposal里的很多东西需要看源 ...
- 【面试题015】链表中倒数第k个结点
[面试题015]链表中倒数第k个结点 可以用两个指针,当第一个指针指向了第k个时候,第二个指针让他指向链表的第一个元素,然后这两个指针同时向后面移动, 当第一个指针移动到末尾的时候,第二个指针指 ...