POJ 1185 状态压缩DP 炮兵阵地
题目直达车: POJ 1185 炮兵阵地
分析:
列( <=10 )的数据比较小, 一般会想到状压DP.
Ⅰ、如果一行10全个‘P’,满足题意的状态不超过60种(可手动枚举)。
Ⅱ、用DFS搜出所有可能表示状态的整数(二进制1表示可以放,0则不能)。
Ⅲ、对每一行的地行进行状态处理(p[i]表示第i行地形的状态),二进制‘H’转1,‘P’转0;
Ⅳ、用dp[i][j][k]表示第i行,且i行状态为j,i-1行状态为k时,最多能放置的量。
Ⅴ、对于第i行的可行状态必须满足:
⒈ j & k =0 且 j & t =0 (t为第i-2行放置状态)与前两行匹配,即不互相攻击。
⒉ j & p[i] = 0 与地形匹配,即只放平原地带。
Ⅵ、转移方程:dp[i][j][k]=max(dp[i][j][k],dp[i-1][k][t]+num[j])
(num[j]为第j种状态中放置炮兵的数量)
第一次做状态DP, 参考(题解报告)的思路才敲出来
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<vector>
using namespace std;
int p[105],dp[105][65][65];
vector<int>M[11];
int a[11],n,m;
void DFS(int k,int t){ ///搜索m=t时如果全为'P'可以表示状态的整数
if(k==t){
int p=0;
for(int i=0;i<t;++i)
if(a[i]) p=p|(1<<i);
M[t].push_back(p); /// 记下能表示状态的整数
return;
}
for(int i=0;i<=1;++i){
if(i&&((k&&a[k-1])||(k>1&&(a[k-1]||a[k-2])))) continue;
a[k]=i;
DFS(k+1,t);
}
}
int main(){
for(int i=1;i<=10;++i) DFS(0,i);
while(~scanf("%d%d",&n,&m)&&n+m){
p[0]=0;
///num[i]记下用第i种状态(整数M[m][i]表示) 中设了多少炮兵部队
int num[65], len=M[m].size();
for(int i=0;i<len;++i)
num[i]=__builtin_popcount( M[m][i] ); ///计算M[m][i]中二进制中1的个数
memset(dp,0,sizeof(dp));
int Max=0;
for(int i=1;i<=n;++i){
char ch[105]; scanf("%s",ch);
p[i]=0;
//预处理地形(1代表'H',0代表'P')
for(int j=0;j<m;++j) if(ch[j]=='H') p[i]|=(1<<j);
if(i==1){ //初始化第一行所有布置情况
for(int k=0; k<len; ++k)
for(int j=0; j<len; ++j){
if(!(M[m][k]&p[1])) dp[1][k][j]=num[k];
else dp[1][k][j]=0;
Max=max(Max,dp[1][k][j]);
}
continue;
}
for(int j=0; j<len; ++j)//当前行
if(!(M[m][j]&p[i])) //与 地形匹配
for(int k=0; k<len; ++k)//i-1
if(!(M[m][k]&p[i-1])&&!(M[m][k]&M[m][j]))//与 地形、i-1行匹配
for(int t=0; t<len; ++t)//i-2
//与 地形、i-1行、i-2行匹配
if(!(M[m][t]&p[i-2])&&!(M[m][t]&M[m][k])&&!(M[m][t]&M[m][j])){
dp[i][j][k]=max(dp[i][j][k],dp[i-1][k][t]+num[j]);
if(i==n)Max=max(dp[i][j][k],Max);
}
}
printf("%d\n",Max);
}
return 0;
}
POJ 1185 状态压缩DP 炮兵阵地的更多相关文章
- POJ 1185 状态压缩DP(转)
1. 为何状态压缩: 棋盘规模为n*m,且m≤10,如果用一个int表示一行上棋子的状态,足以表示m≤10所要求的范围.故想到用int s[num].至于开多大的数组,可以自己用DFS搜索试试看:也可 ...
- 【简●解】POJ 1185,LG P2704【炮兵阵地】
POJ 1185,LG P2704[炮兵阵地] 状压经典入门. [传送门] POJ 1185 洛谷 P2704 [题目大意] 司令部的将军们打算在 \(N\times M\) 的网格地图上部署他们的炮 ...
- poj 1185 状态压缩
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 27926 Accepted: 10805 Descriptio ...
- poj 2923(状态压缩dp)
题意:就是给了你一些货物的重量,然后给了两辆车一次的载重,让你求出最少的运输次数. 分析:首先要从一辆车入手,搜出所有的一次能够运的所有状态,然后把两辆车的状态进行合并,最后就是解决了,有两种方法: ...
- poj 2688 状态压缩dp解tsp
题意: 裸的tsp. 分析: 用bfs求出随意两点之间的距离后能够暴搜也能够用next_permutation水,但效率肯定不如状压dp.dp[s][u]表示从0出发訪问过s集合中的点.眼下在点u走过 ...
- Mondriaan's Dream(POJ 2411状态压缩dp)
题意:用1*2的方格填充m*n的方格不能重叠,问有多少种填充方法 分析:dp[i][j]表示i行状态为j时的方案数,对于j,0表示该列竖放(影响下一行的该列),1表示横放成功(影响下一列)或上一列竖放 ...
- poj 2411 状态压缩dp
思路:将每一行看做一个二进制位,那么所有的合法状态为相邻为1的个数一定要为偶数个.这样就可以先把所有的合法状态找到.由于没一层的合法状态都是一样的,那么可以用一个数组保存.由第i-1行到第i行的状态转 ...
- poj 3254 状态压缩DP
思路:把每行的数当做是一个二进制串,0不变,1变或不变,找出所有的合法二进制形式表示的整数,即相邻不同为1,那么第i-1行与第i行的状态转移方程为dp[i][j]+=dp[i-1][k]: 这个方程得 ...
- POJ 3254 状态压缩 DP
B - Corn Fields Crawling in process... Crawling failed Time Limit:2000MS Memory Limit:65536KB ...
随机推荐
- 监听div内容改变
做前端突击队,外星人那道是自己手动模拟那个时间的变化的,但正确思路应该是监听div内容的变化然后同步到输入框中,遂今天找了一下,结果如下: $('div').bind('DOMNodeInserted ...
- xe6+firedac连接sybase
一.Win7 X64系统安装sybase odbc: 1. 下载对应包至c:\system_odbc(文件夹名自己取,在后面注册表内容需要用到): 2. 将值信息写入到注册表内: Windows ...
- Using .NET 4's Lazy<T> 实现单实例
Using .NET 4's Lazy<T> type Explanation of the following code: If you're using .NET 4 (or high ...
- 如何利用C生成.so供Mono调用
Mono诞生的初衷是为了吸引更多的Windows .Net程序员来加入Linux平台的开发.但在Linux世界中C语言依然是 主流.很多时候一些关键应用(比如大型 笛卡儿 乘积运算.需要调用平台硬件功 ...
- (转)搜索Maven仓库 获取 groupid artifactId
转载自:http://blog.csdn.net/z69183787/article/details/22188561 使用Maven进行开发的时候,比较常见的一个问题就是如何寻找我要的依赖,比如说, ...
- SSM框架+Plupload实现断点续传(Spring+SpringMVC+MyBatis+Plupload)
关于Plupload的介绍,相信它的官网http://www.plupload.com/已经给得很详细了.Plupload的上传原理简单点说,就是将用户选中的文件(可多个)分隔成一个个小块,依次向服务 ...
- JVM 找出最耗 cpu的线程 并打印线程栈
监控JVM中最占cpu的线程 top -Hp pid JVM中最占cpu的线程ID -o THREAD,tid,time | awk 'BEGIN {count=0; } { if($2>0.3 ...
- redis入门教程
21) Redis 简介Redis 是一个开源的使用 ANSI C 语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value 数据库.2) 数据类型2.1. Redis 的 KeyRedi ...
- Discuz!X3.1 全新安装图文教程
http://www.discuz.net/thread-3456887-1-1.html
- 移动应用产品开发-android开发(二)
这段时间实在太忙了,也没什么精力来写博客,还是没养成写博客的习惯,还是得记载下来,不然时间久了就忘记了. 早上一大早就来公司了,趁还早,拟定今天的工作内容和计划后,赶紧记载点东西. 最近做androi ...