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)的更多相关文章

  1. POJ 1185 炮兵阵地(状压DP)

    炮兵阵地 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 26426   Accepted: 10185 Descriptio ...

  2. POJ 1185 炮兵阵地 【状压DP】

    <题目链接> 题目大意: 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平 ...

  3. POJ 1185 炮兵阵地 (状压DP)

    题目链接 题意 : 中文题不详述. 思路 :状压DP,1表示该位置放炮弹,0表示不放.dp[i][j][k],代表第 i 行的状态为k时第i-1行的状态为 j 时放置的最大炮弹数.只是注意判断的时候不 ...

  4. POJ 1185 炮兵阵地 (状压dp)(棋盘dp)

    这题和poj 3254很像,但是更复杂了一些 都属于棋盘里放东西,然后又各种各样的限制,然后求方案或者最大值 (1)上一道题距离要大于1,这道题是大于2.所以判断的时候变成 !(x & (x ...

  5. POJ 1185 炮兵阵地 (状压DP,轮廓线DP)

    题意: 给一个n*m的矩阵,每个格子中有'P'或者'H',分别表示平地和高原,平地可以摆放大炮,而大炮的攻击范围在4个方向都是2格(除了自身位置),攻击范围内不能有其他炮,问最多能放多少个炮?(n&l ...

  6. POJ 1185 炮兵阵地(状压DP)题解

    思路:和上一篇思路一样,但是这里要求最大能排几个,这里要开三维,记录上次和上上次的状态,再一一判定,状态转移方程为 dp[i][j][k] = max(dp[i][j][k],dp[i - 1][k] ...

  7. POJ P1185 炮兵阵地 【状压dp】

    炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 29502 Accepted: 11424 Description 司令 ...

  8. 【POJ】1185 炮兵阵地(状压dp)

    题目 传送门:QWQ 分析 看到$ M<=10 $考虑状压. 然后把每行都压一下,那么每个状态相关的就是上一行和上上行的状态. 然后枚举. 然后复杂度最坏是$ O(100 \times 1024 ...

  9. poj 1185 炮兵阵地 [经典状态压缩DP]

    题意:略. 思路:由于每个大炮射程为2,所以如果对每一行状态压缩的话,能对它造成影响的就是上面的两行. 这里用dp[row][state1][state2]表示第row行状态为state2,第row- ...

随机推荐

  1. Servlet 3.0 新特性详解 (转载)

    原文地址:https://www.ibm.com/developerworks/cn/java/j-lo-servlet30/ Servlet 3.0 新特性概述 Servlet 3.0 作为 Jav ...

  2. smile domain name www.bn-nd.com for sell. Please contact boyanzheng at foxmail.com 微笑的域名。请联系邮箱。

  3. vueCode 常用代码总结 20190116

    <template>props 传参<in-body :mbx="['首页','','']"> props 代码使用<BreadcrumbItem&g ...

  4. mybatis中配置中引入properties文件

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC ...

  5. myBatis的binding错误:Invalid bound statement (not found)

    org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)错误这个问题我找了好久,终于找到了正确的写 ...

  6. OpenCV2:第七章 图像处理

    一.简介 灰度图(灰阶图),把白色到黑色之间分为256阶灰度 彩色图有RGB三个分量,假设图是800*800像素,那么就有三个800*800的矩阵分别代表RGB 二值化处理设定阈值,在阈值中的像素值变 ...

  7. 【传智播客】Libevent学习笔记(五):基本类型和函数

    目录 00. 目录 01. 基本类型 1.1 evutil_socket_t类型 1.2 标准类型 1.3 各种兼容性类型 02. 可移植的定时器函数 03. 套接字API兼容性 04. 可移植的字符 ...

  8. HTML中pre标签的用法

    我们经常会在要保持文本格式的时候使用pre标签,比如当我们要展示源代码的时候,只要放一个pre标签,然后把源代码直接复制,粘贴,然后在页面上就可以保持好格式.不会像放在其它标签里那样,把换行和空格都自 ...

  9. 关于Servlet一些东西

    ---- 概念 Servlet是一种服务器端的Java应用程序,具有独立于平台和协议的特性,可以生成动态的Web页面. 它担当客户请求(Web浏览器或其他HTTP客户程序)与服务器响应(HTTP服务器 ...

  10. Centos7安装tomcat(wget获取安装包)

    选择要下载的版本去tomcat库查看想要下载的版本 https://mirrors.cnnic.cn/apache/tomcat/ 下载选择tomcat8的一个版本 wget https://mirr ...