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" 表示),也可能是平 ...
随机推荐
- mysql中实现oracle中的rowid功能
mysql中没有函数实现,只能自己手动添加变量递增 := 就是赋值,只看红色字体就行 select @rownum:=@rownum+1,img.img_path,sku.sku_name from ...
- android开发 java与c# 兼容AES加密
由于android客户端采用的是AES加密,服务器用的是asp.net(c#),所以就造成了不一致的加密与解密问题,下面就贴出代码,已经试验过. using System; using System. ...
- org.apache.commons.dbutils.QueryRunner 执行sqlserver的存储过程
执行不带输出参数的存储过程与 执行普通update sql没有什么区别,直接调用即可: 示例代码: public Boolean startResidentialInfoStatistics(Str ...
- python logging TimedRotatingFileHandler 作用
max backup count这样的参数,即打印的日志文件数量超过这个阈值,发生rotate,从最老的文件开始清理 未亲测.
- 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
// test20.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...
- phonegap 环境搭建
经过了一番讨论,最后还是决定用phonegap来开发产品.因为用phonegap的人力成本相比原生开发还是节省了不少,并且可以跨平台.至于软件的运行效率,在ios上还是相当流畅的,在android上就 ...
- android2.3 -添加自定义按键:作唤醒功能 .
最近需要做个唤醒功能,当按键的时候android系统唤醒并点亮屏,在长按键中,系统不能在进入睡眠. 驱动方面: 1:在平台设备文件中添加 一个按键,定义为唤醒源! \arch\arm\mach-s5p ...
- Cloud Insight 仪表盘上线 | 全面监控 Redis
OneAPM 作为应用性能领域的新兴领军企业,近期发布了重量级新产品-- Cloud Insight 数据管理平台,用它能够监控所有基础组件,并通过 tag 标签对数据进行管理. 近日,Cloud I ...
- java基础知识回顾之java Thread类学习(四)--java多线程安全问题(锁)
上一节售票系统中我们发现,打印出了错票,0,-1,出现了多线程安全问题.我们分析为什么会发生多线程安全问题? 看下面线程的主要代码: @Override public void run() { // ...
- 使用getScript()方法异步加载并执行js文件
使用getScript()方法异步加载并执行js文件 使用getScript()方法异步请求并执行服务器中的JavaScript格式的文件,它的调用格式如下所示: jQuery.getScript(u ...