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. Failure to transfer org.apache.maven.plugins:maven-compiler-plugin:jar:2.5.1

    Mac上写了一段基于Maven的java代码. 上传Git后,在windows上pull下来,eclipse里面各种错误. ArtifactTransferException:Failure to t ...

  2. 程序员必须知道FTP命令

                                             程序员必须知道FTP命令 文件传输软件的使用格式为:FTP<FTP地址>,若连 接成功,系统将提示用户输入 ...

  3. IOS代码收集

    http://mobile.51cto.com/hot-410417.htm 退回输入键盘: - (BOOL) textFieldShouldReturn:(id)textField{ [textFi ...

  4. hdu 2192 MagicBuilding

    Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...

  5. 30行代码消费腾讯人工智能开放平台提供的自然语言处理API

    腾讯人工智能AI开放平台上提供了很多免费的人工智能API,开发人员只需要一个QQ号就可以登录进去使用. 腾讯人工智能AI开放平台的地址:https://ai.qq.com/ 里面的好东西很多,以自然语 ...

  6. Halcon学习笔记1

    转:https://www.cnblogs.com/hanzhaoxin/archive/2013/02/15/2912879.html 机器视觉工程应用主要可划分为硬件和软件两大部分. 硬件:工程应 ...

  7. ML-学习提纲1

    http://www.sohu.com/a/130379077_468714 本文用一系列「思维导图」由浅入深的总结了「统计学」领域的基础知识,是对之前系列文章做的一次完整的梳理,也是我至今为止所有与 ...

  8. Eclipse--java.lang.OutOfMemoryError: PermGen space

    这一段时间,Eclipse总是死掉,几乎是稍微操作快一点就会死掉,几分钟一次,搞得人郁闷至极.浪费了不少时间,在网上搜了下,看到很多朋友也出现类似的情况,在网上求救,但是网上的办法都只是说通过修改ec ...

  9. DROP DATABASE - 删除一个数据库

    SYNOPSIS DROP DATABASE name DESCRIPTION 描述 DROP DATABASE 删除一个现存数据库的目录入口并且删除包含数据的目录. 只有数据库所有者能够执行这条命令 ...

  10. 什么是JavaScript框架-------share

    摘要:现代网站和web应用程序趋向于依赖客户端的大量的javascript来提供丰富的交互.特别是通过不刷新页面的异步请求来返回数据或从服务器端的脚本(或数据系统)中得到响应.在这篇文章中,你将会了解 ...