poj -1185 炮兵阵地 (经典状压dp)
http://poj.org/problem?id=1185
参考博客:http://poj.org/problem?id=1185
大神博客已经讲的很清楚了,注意存状态的时候是从1开始的,所以初始化的时候也是dp[1][1][state],从0开始的话,状态就是dp[1][0][state]了.
dp[i][j][k]表示第i行状态为k第i-1行状态为j时的方案数.
dp[i][j][k]=max(dp[i][j][k],dp[i-1][t][j]+num[k]); (num[k]为k状态中1的个数)
边界条件:dp[1][1][i]=num[i],状态i可以满足第一行的条件。
还有就是为什么每一行最多只有60种状态,poj题目讨论里面有人给出了枚举的代码。
#include <iostream>
using namespace std;
bool isok( int c ) {
return !(c&(c<<)||c&(c<<));//同一行中不能有相邻的1距离小于3
}
int main() {
int count=;
for( int i=; i<; i++ )
count += isok(i);
cout<<count<<endl;
return ;
}
#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
#include <cstring>
#include <string>
#include <algorithm>
#include <string>
#include <set>
#include <functional>
#include <numeric>
#include <sstream>
#include <stack>
//#include <map>
#include <queue>
#include <deque>
//#pragma comment(linker, "/STACK:102400000,102400000")
#define CL(arr, val) memset(arr, val, sizeof(arr)) #define ll long long
#define INF 0x7f7f7f7f
#define lc l,m,rt<<1
#define rc m + 1,r,rt<<1|1
#define pi acos(-1.0) #define L(x) (x) << 1
#define R(x) (x) << 1 | 1
#define MID(l, r) (l + r) >> 1
#define Min(x, y) (x) < (y) ? (x) : (y)
#define Max(x, y) (x) < (y) ? (y) : (x)
#define E(x) (1 << (x))
#define iabs(x) (x) < 0 ? -(x) : (x)
#define OUT(x) printf("%I64d\n", x)
#define lowbit(x) (x)&(-x)
#define Read() freopen("a.txt", "r", stdin)
#define Write() freopen("b.txt", "w", stdout);
#define maxn 110
#define maxv 5010
#define mod 1000000000
using namespace std;
int n,m;
char map[][],num[],top;
int stk[],cur[];
int dp[][][]; inline bool ok(int x) //判断该状态是否合法,即同一行不存在相邻1之间的距离小于3的
{
if(x&(x<<)||x&(x<<)) return ;
return ;
}
inline void jnite() //找到所有可能合法的状态
{
top=;
int total=<<m;
for(int i=;i<total;i++)
if(ok(i)) stk[++top]=i;
} inline bool fit(int x,int k) //判断状态x是否与第k行匹配
{
if(cur[k]&x) return ;
return ;
}
inline int jcount(int x) //计算一个整型数x的二进制中1的个数(用于初始化)
{
int cnt=;
while(x)
{
cnt++;
x&=(x-); //很精炼,每次都会与掉一个1
}
return cnt;
}
int main()
{
//Read();
while(~scanf("%d%d",&n,&m))
{
if(n==&&m==) break;
jnite();
for(int i=;i<=n;i++) scanf("%s",map[i]+);
for(int i=;i<=n;i++)
{
cur[i]=;
for(int j=;j<=m;j++)
{
if(map[i][j]=='H') cur[i]+=(<<(j-));
}
//printf("%d\n",cur[i]);
}
memset(dp,,sizeof(dp));
for(int i=;i<=top;i++) //初始化第一行
{
num[i]=jcount(stk[i]);
//printf("%d\n",num[i]);
if(fit(stk[i],)) dp[][][i]=num[i];
}
for(int i=;i<=n;i++) {
for(int t=;t<=top;t++) {
if(!fit(stk[t],i)) continue;//第i行是否冲突
for(int j=;j<=top;j++) {
if(stk[t]&stk[j]) continue;//第i行和第i-2行是否冲突
for(int k=;k<=top;k++) {
if(stk[t]&stk[k]) continue;//第i行和第i-1行是否冲突
dp[i][k][t]=max(dp[i][k][t],dp[i-][j][k]+num[t]);
// printf("%d\n",dp[i][k][t]);
}
}
}
}
int ans=; //得到最大值
for(int i=;i<=top;i++)
for(int j=;j<=top;j++)
ans=max(ans,dp[n][i][j]);
printf("%d\n",ans);
}
return ;
}
poj -1185 炮兵阵地 (经典状压dp)的更多相关文章
- POJ 1185 炮兵阵地(状压DP)
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 26426 Accepted: 10185 Descriptio ...
- POJ 1185 炮兵阵地 【状压DP】
<题目链接> 题目大意: 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平 ...
- POJ 1185 炮兵阵地 (状压DP)
题目链接 题意 : 中文题不详述. 思路 :状压DP,1表示该位置放炮弹,0表示不放.dp[i][j][k],代表第 i 行的状态为k时第i-1行的状态为 j 时放置的最大炮弹数.只是注意判断的时候不 ...
- POJ 1185 炮兵阵地 (状压dp)(棋盘dp)
这题和poj 3254很像,但是更复杂了一些 都属于棋盘里放东西,然后又各种各样的限制,然后求方案或者最大值 (1)上一道题距离要大于1,这道题是大于2.所以判断的时候变成 !(x & (x ...
- POJ 1185 炮兵阵地 (状压DP,轮廓线DP)
题意: 给一个n*m的矩阵,每个格子中有'P'或者'H',分别表示平地和高原,平地可以摆放大炮,而大炮的攻击范围在4个方向都是2格(除了自身位置),攻击范围内不能有其他炮,问最多能放多少个炮?(n&l ...
- POJ 1185 炮兵阵地(状压DP)题解
思路:和上一篇思路一样,但是这里要求最大能排几个,这里要开三维,记录上次和上上次的状态,再一一判定,状态转移方程为 dp[i][j][k] = max(dp[i][j][k],dp[i - 1][k] ...
- POJ P1185 炮兵阵地 【状压dp】
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 29502 Accepted: 11424 Description 司令 ...
- 【POJ】1185 炮兵阵地(状压dp)
题目 传送门:QWQ 分析 看到$ M<=10 $考虑状压. 然后把每行都压一下,那么每个状态相关的就是上一行和上上行的状态. 然后枚举. 然后复杂度最坏是$ O(100 \times 1024 ...
- poj 1185 炮兵阵地 [经典状态压缩DP]
题意:略. 思路:由于每个大炮射程为2,所以如果对每一行状态压缩的话,能对它造成影响的就是上面的两行. 这里用dp[row][state1][state2]表示第row行状态为state2,第row- ...
随机推荐
- PMP项目管理学习笔记(3)——过程框架
所有项目,不论大小,都可以分解为过程组: 如果项目规模很大,可以分阶段管理,每个阶段都要经过上面的五个过程组,从启动到收尾. 阶段的类型: 顺序阶段: 一个阶段完成后进入下个阶段. 重叠阶段: 有时需 ...
- JavaScript 字符串与数字的相互转换
js字符串转换成数字 js 字符串转换数字方法主要有三种:转换函数.强制类型转换.利用JS变量弱类型特点进行转换 1. 转换函数:js提供了parseInt()和parseFloat()两个转换函数. ...
- HDU 5391 Zball in Tina Town (打表,水)
题意: Tina有一个球,它的名字叫zball.zball很神奇,它会每天变大.在第一天的时候,它会变大1倍.在第二天的时候,它会变大2倍.在第n天的时候,它会变大n倍.zball原来的体积是1.Ti ...
- Servlet 3.0 新特性详解 (转载)
原文地址:https://www.ibm.com/developerworks/cn/java/j-lo-servlet30/ Servlet 3.0 新特性概述 Servlet 3.0 作为 Jav ...
- SAP CRM和Cloud for Customer中的Event handler(事件处理器)
SAP CRM可以在开发工具中用右键直接创建一个新的事件处理器: 这些事件处理器实际上就是UI控制器(Controller)上具有特定接口类型的方法. C4C UI的event handler 在C4 ...
- (转)编码剖析Spring依赖注入的原理
http://blog.csdn.net/yerenyuan_pku/article/details/52834561 Spring的依赖注入 前面我们就已经讲过所谓依赖注入就是指:在运行期,由外部容 ...
- 事件捕获 & 事件冒泡
<body> <div id="div1"> <div id="div2"> <div id="div3&q ...
- Postman 安装及使用入门教程 | 前后台 写接口的 徐工给的
https://www.cnblogs.com/mafly/p/postman.html
- python:第一章
完成同一个任务,C语言要写1000行代码,Java只需要写100行,而Python可能只要20行. 代码少的代价是运行速度慢,C程序运行1秒钟,Java程序可能需要2秒,而Python程序可能就需要1 ...
- Python打包成exe,pyc
D:\mypython\path\ C:\Python27\Scripts\pyinstaller.exe -w mypython.py # Python打包成exe D:\mypython\path ...