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" 表示),也可能是平 ...
随机推荐
- 20145120黄玄曦 《java程序设计》 寒假学习总结
1和2.我对未来规划不多,我认为好好学习积累知识能帮助我应对未来的挑战,这是我的学习动力之一,此外,了解新知识满足好奇心也是我的主要的学习动力. 3.我认为专业课学习比公务员考试重要,我认为专业知识是 ...
- c++ linux 下的调试工具及用法
1当程序出现core的时候: gdb out[your program] core.out.45726.1431954543 可以看到程序崩溃时候的堆栈信息. valgrind ./out 由于val ...
- 编写一个递归函数,输出vector对象的内容
// test14.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...
- 【设计模式六大原则5】迪米特法则(Law Of Demeter)
定义:一个对象应该对其他对象保持最少的了解. 问题由来:类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大. 解决方案:尽量降低类与类之间的耦合. 自从我们接触编程开始 ...
- sql over()---转载
1.使用over子句与rows_number()以及聚合函数进行使用,可以进行编号以及各种操作.而且利用over子句的分组效率比group by子句的效率更高. 2.在订单表(order)中统计中,生 ...
- SGU 114
114. Telecasting station time limit per test: 0.25 sec. memory limit per test: 4096 KB Every city in ...
- Hibernate3中将指定的HQL语句转换成SQL语句
import org.hibernate.engine.SessionFactoryImplementor; import org.hibernate.hql.ast.QueryTranslatorI ...
- SDUT图结构练习——最小生成树
http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2144&cid=1186 这道题一开始是用prim算法做的,一直错一直错,后来问了帅郭改用 ...
- 前端H5开发工具 Adobe Edge
http://www.cnblogs.com/adobeedge/ http://my.oschina.net/duolus/blog/212801?fromerr=WAcqscJl
- hdu2012
http://acm.hdu.edu.cn/showproblem.php?pid=2012 数组大小算错了.....郁闷-_- #include<iostream> #include&l ...