POJ 1185 炮兵阵地(状态压缩DP)
题解:nState为状态数,state数组为可能的状态
代码:
#include <map>
#include <set>
#include <list>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <cstdio>
#include <string>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; const int INF=0x3f3f3f3f;
typedef long long ll;
typedef unsigned long long ull;
#define fi first
#define se second
#define prN printf("\n")
#define SI(N) scanf("%d",&(N))
#define SII(N,M) scanf("%d%d",&(N),&(M))
#define SIII(N,M,K) scanf("%d%d%d",&(N),&(M),&(K))
#define cle(a,val) memset(a,(val),sizeof(a))
#define rep(i,b) for(int i=0;i<(b);i++)
#define Rep(i,a,b) for(int i=(a);i<=(b);i++) int n,m,dp[105][80][80];
int row[105];
int nState,state[80],num[80]; void init()
{
int k=1<<m;
nState=0;
rep(i,k)
{
if ((i&(i<<1))==0&&(i&(i<<2))==0)
{
state[nState]=i;
num[nState]=0;
int j=i;
while(j)
{
num[nState]+=j%2;
j/=2;
}
nState++;
}
}
} int main()
{
#ifndef ONLINE_JUDGE
freopen("C:\\Users\\Zmy\\Desktop\\in.txt","r",stdin);
// freopen("C:\\Users\\Zmy\\Desktop\\out.txt","w",stdout);
#endif // ONLINE_JUDGE char str[20]= {0}; while(cin>>n>>m)
{
init();
rep(i,n)
{
row[i]=0;
scanf("%s",str);
rep(j,m)
{
if (str[j]=='P')
{
row[i]+=1<<j;
}
}
} cle(dp,0); rep(j,nState)
{
if ((state[j]&row[0])!=state[j])
{
continue;
}
rep(k,nState)
{
dp[0][j][k]=num[j];
}
} if (n>1)
rep(j,nState)
{
if ((state[j]&row[1])!=state[j])
{
continue;
}
rep(k,nState)//这的k代表的是上上个
{
if ((state[j]&state[k])==0)
{
dp[1][j][k]=dp[0][k][0] + num[j];/**< 这是啥意思?? */
}
}
} Rep(i,2,n-1)
{
rep(j,nState)
{
if ((state[j]&row[i])!=state[j])
{
continue;
}
rep(k,nState)//这的k代表的是上上个
{
if ( state[j] & state[k] )
continue;
for (int h = 0; h < nState; h++)/**< i是这个,j是上1,k是上2,h是上3 */
{
if ( state[j] & state[h] )
continue;
if ( dp[i-1][k][h] > dp[i][j][k] )
dp[i][j][k] = dp[i-1][k][h];
}
dp[i][j][k] += num[j]; }
}
}
int maxa = 0;
for (int j = 0; j < nState; j++)
{
for (int k = 0; k < nState; k++)
if (maxa < dp[n-1][j][k])
maxa = dp[n-1][j][k];
} printf("%d\n", maxa); } return 0;
}
POJ 1185 炮兵阵地(状态压缩DP)的更多相关文章
- poj 1185 炮兵阵地 状态压缩dp
思路:定义一个三维数组dp[x][i][j]其中x为now和pre两种状态,now表示当前两行最优解,pre表示出了本行外,前两行的最优解.那么状态转移方程为 dp[now][j][k]=max(dp ...
- POJ - 1185 炮兵阵地 (状态压缩)
题目大意:中文题目就不多说大意了 解题思路: 1.每行最多仅仅有十个位置,且不是山地就是平原,那么就能够用1表示山地,0表示平原,将每一行的状态进行压缩了 2.接着找出每行能放炮兵的状态.先不考虑其它 ...
- POJ 3254 炮兵阵地(状态压缩DP)
题意:由方格组成的矩阵,每个方格可以放大炮用P表示,不可以放大炮用H表示,求放最多的大炮,大炮与大炮间不会互相攻击.大炮的攻击范围为两个方格. 分析:这次当前行的状态不仅和上一行有关,还和上上行有关, ...
- POJ 1185 炮兵阵地 状压dp
题目链接: http://poj.org/problem?id=1185 炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K 问题描述 司令部的将军们打算在N*M ...
- POJ1185 - 炮兵阵地(状态压缩DP)
题目大意 中文的..直接搬过来... 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平 ...
- poj - 1185 炮兵阵地 状压DP 解题报告
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 21553 Accepted: 8363 Description ...
- POJ 1185炮兵阵地 (状压DP)
题目链接 POJ 1185 今天艾教留了一大堆线段树,表示做不动了,就补补前面的题.QAQ 这个题,我第一次写还是像前面HDU 2167那样写,发现这次影响第 i 行的还用i-2行那样,那以前的方法就 ...
- [poj 1185] 炮兵阵地 状压dp 位运算
Description 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用&quo ...
- luogu2704 炮兵阵地 状态压缩DP
题目大意:一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),在每一格平原地形上最多可以布置一支炮兵部队,能攻击到的区域:沿横向左右各两格,沿纵向上 ...
- POJ1185炮兵阵地(状态压缩 + dp)
题目链接 题意:给出一张n * m的地图,其中 有的地方能放大炮,有的地方不能,大炮与上下左右两个单位范围内会相互攻击,问最多能放几个大炮 能放大炮为1不能放大炮为0,把每一行看做一个状态,要除去同一 ...
随机推荐
- URAL Mosaic(并查集)(欧拉回路)
Mosaic Time limit: 0.25 secondMemory limit: 64 MB There's no doubt that one of the most important an ...
- 查找字符串的 KMP 算法
查找字符串是我们平常编程过程中经常遇到的,现在介绍一种查找字符串算法,增加程序的执行速度. 通常我们是这么写的: /* content: search a string in a othor stri ...
- Android sdk 镜像服务器资源
大连东软信息学院镜像服务器地址:- http://mirrors.neusoft.edu.cn 端口:80北京化工大学镜像服务器地址:- IPv4: http://ubuntu.buct.edu.cn ...
- 利用caffe生成 lmdb 格式的文件,并对网络进行FineTuning
利用caffe生成 lmdb 格式的文件,并对网络进行FineTuning 数据的组织格式为: 首先,所需要的脚本指令路径为: /home/wangxiao/Downloads/caffe-maste ...
- MicroSoft Visual C++ 6.0怎么建立C++文件工程?
1.打开VC6.02.选择菜单中的"文件"->"新建",弹出"新建"对话框3.在"新建"对话框中选择四个Sheet ...
- JSBinding / Gen Bindings
Classes in JSBindingSettings.classes array will be exported to JavaScript. There are already many cl ...
- dede后台栏目文章问题
栏目下的子栏目文档,并不记在主栏目文档数中,让我一直以为程序错误.
- Unity3D深入浅出 - 新版粒子系统 (Shuriken) - Tonge
Shuriken粒子系统是继Unity3.5版本之后推出的新版粒子系统,它采用了模块化管理,个性化的粒子模块配合粒子曲线编辑器使用户更容易创作出各种兵分复杂的粒子效果. 创建一个粒子系统的方式有两种: ...
- 【转】DBMS_STATS.GATHER_TABLE_STATS详解 2012-04-22 09:20:10
[转]DBMS_STATS.GATHER_TABLE_STATS详解 2012-04-22 09:20:10 分类: Linux 由于Oracle的优化器是CBO,所以对象的统计数据对执行计划的生成至 ...
- easyUI之message
message组件,依赖于window组件.progressbar组件两个面板. 它有几个不同的显示风格,与vb中的msgbox相对应,有alert.progrss.confirm.prompt等形式 ...