POJ 1185 经典状压dp
做了很久的题 有注释
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<math.h>
using namespace std;
int dp[107][107][107];///二维记录上一次 三维记录此次
///dp[i][k][j]=max(dp[i][k][j],dp[i-1][t][k])+num[j]; t为枚举数且满足与 k j 的条件
///初始化can num数组减少时间
///如果不使用can数组来记录 memset都会超时
int can[107];
int num[107];
int n,m;
int c[107];
char s[107];
bool ok(int x)
{
if(x&(x<<1))
return false;
if(x&(x<<2))
return false;
return true;
}
int main(){
while(~scanf("%d%d",&n,&m))
{
for(int i=0;i<n;i++)
{
scanf("%s",s);
c[i]=0;
for(int k=0;k<m;k++)
{
if(s[k]=='H')
c[i]+=(1<<k);
}
}
int w=0;
memset(dp,-1,sizeof(dp));
for(int i=0;i<(1<<m);i++)
{
if(ok(i))
{
can[w]=i;
int x=can[w];
num[w]=0;
while(x>0)
{
if(x&1)num[w]++;
x>>=1;
}
w++;
}
}
for(int i=0;i<w;i++)
{
if(!(can[i]&c[0])) ///得满足条件才能放
dp[0][0][i]=num[i];
}
for(int i=1;i<n;i++)
{
for(int j=0;j<w;j++)
{
if(c[i]&can[j])
continue;
for(int k=0;k<w;k++)
{
if(can[j]&can[k])
continue;
for(int t=0;t<w;t++)
{
if(can[j]&can[t]||can[k]&can[t])
continue;
if(dp[i-1][t][k]==-1) ///如果上一行等于-1说明不满足条件
continue;
dp[i][k][j]=max(dp[i][k][j],dp[i-1][t][k]+num[j]);
}
}
}
}
int ans=0;
for(int k=0;k<n;k++)
for(int i=0;i<w;i++)
for(int j=0;j<w;j++)
{
ans=max(ans,dp[k][i][j]);
}
printf("%d\n",ans);
}
}
POJ 1185 经典状压dp的更多相关文章
- POJ 3254 & POJ 1185(状压DP入门)
Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 16773 Accepted: 8860 Desc ...
- poj 1185 (状压dp)
Problem 炮兵阵地 题目大意 给你一张n*m的地图,一些地区是空地,一些地区是障碍. 可以在空地上布置炮兵部队,炮兵部队的攻击范围为上下左右各两格. 询问最多可以布置多少个炮兵部队,且互不伤害. ...
- poj3311 TSP经典状压dp(Traveling Saleman Problem)
题目链接:http://poj.org/problem?id=3311 题意:一个人到一些地方送披萨,要求找到一条路径能够遍历每一个城市后返回出发点,并且路径距离最短.最后输出最短距离即可.注意:每一 ...
- POJ 3254 简单状压DP
没什么可说的,入门级状压DP.直接撸掉 #include <iostream> #include <cstring> #include <cstdlib> #inc ...
- poj -1185 炮兵阵地 (经典状压dp)
http://poj.org/problem?id=1185 参考博客:http://poj.org/problem?id=1185 大神博客已经讲的很清楚了,注意存状态的时候是从1开始的,所以初始化 ...
- Corn Fields POJ - 3254 (状压dp)
题目链接: Corn Fields POJ - 3254 题目大意:给你一个n*m的矩阵,矩阵的元素只包括0和1,0代表当前的位置不能放置人,1代表当前的位置可以放人,当你决定放人的时候,这个人的四 ...
- hoj 2662 经典状压dp // MyFirst 状压dp
题目链接:http://acm.hit.edu.cn/hoj/problem/view?id=2662 1.引言:用dp解决一个问题的时候很重要的一环就是状态的表示,一般来说,一个数组即可保存状态. ...
- HDU 1074 Doing Homework(经典状压dp)
题目链接 Doing Homework Ignatius has just come back school from the 30th ACM/ICPC. Now he has a ...
- 【BZOJ1087】 [SCOI2005]互不侵犯King 状压DP
经典状压DP. f[i][j][k]=sum(f[i-1][j-cnt[k]][k]); cnt[i]放置情况为i时的国王数量 前I行放置情况为k时国王数量为J #include <iostre ...
随机推荐
- cenos配置
#修复ifconfig1.查看 /sbin/ifconfig是否存在 echo $PATH2.查看ifconfig命令是否存在ls /sbin |grep ifconfig如果ifconfig命令存在 ...
- .net学习笔记---Asp.net的生命周期之二页生命周期
用户请求 从 用户角度来说,我不管你后台经历了什么,我只想要我请求的页面.请求到服务器端,服务器必须得有所表示的是吧,即使不想搭理人家也得让IIS给人家说声:找不到服务器.请求来到服务器端,肯定要让服 ...
- webpack入门--前端必备
webpack入门--前端必备 什么是 webpack? webpack是一款模块加载器兼打包工具,它能把各种资源,例如JS(含JSX).coffee.样式(含less/sass).图片等都作为模块来 ...
- zookeeper理论
第一章 Zookeeper server 1.1 Zookeeper基本原理 1.1.1 Zookeeper的保证 l 顺序性,client的updates请求都会根据它发出的 ...
- Windows 7下搭建Jmeter测试环境
jmeter配置.安装 一. 工具描述 apache jmeter是100%的java桌面应用程序,它被设计用来加载被测试软件功能特性.度量被测试软件的性能.设计jmeter的初衷是测试web应用,后 ...
- node基础 --全局
全局对象: global:永远使用var 定义变量以避免引入全局变量; process:所有全局执行上下文的内容都在process对象中: 模块和包: 模块:一个Node.js 文件就是一个模块,这个 ...
- http://jingyan.baidu.com/album/03b2f78c4cc0ad5ea337ae7d.html
http://jingyan.baidu.com/album/03b2f78c4cc0ad5ea337ae7d.html
- MapReduce的输入输出格式
默认的mapper是IdentityMapper,默认的reducer是IdentityReducer,它们将输入的键和值原封不动地写到输出中. 默认的partitioner是HashPartitin ...
- HDU1576 A/B(乘法逆元)
题目的代数系统可以看作整数模9973乘法群?然后存在乘法逆元. 于是题目要求$A \div B \pmod {9973} $其实就相当于求$A \times B^{-1}\pmod {9973} $. ...
- BZOJ1185 : [HNOI2007]最小矩形覆盖
求出凸包后,矩形的一条边一定与凸包的某条边重合. 枚举每条边,求出离它最远的点和离它最左最右的点,因为那三个点是单调变化的,所以复杂度为$O(n)$. 注意精度. #include<cstdio ...