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 ...
随机推荐
- [MACOS] Mac上的抓包工具Charles
转载自: http://blog.csdn.net/jiangwei0910410003/article/details/41620363 今天就来看一下Mac上如何进行抓包,之前有一篇文章介绍了使用 ...
- C语言,输入一个正整数,按由大到小的顺序输出它的所有质数的因子(如180=5*3*3*2*2)
#include <iostream> using namespace std; int main() { long num; while(cin >> num){ ){ co ...
- 编译预处理命令--define和ifdef的使用
这里将对常用的预处理命令进行学习. 一.宏定义 ·defined 格式:`defined 宏名 数值 或者 `define 宏名 注意:后面没有‘;‘,和单片机不一样: ...
- windows休眠命令
windows休眠命令 rundll32 powrprof.dll,SetSuspendState windows关闭休眠功能命令:powercfg -h off 1 打开“控制面板”→“电源选项”, ...
- Java Hour 29 Weather ( 2 ) Maven
有句名言,叫做10000小时成为某一个领域的专家.姑且不辩论这句话是否正确,让我们到达10000小时的时候再回头来看吧. Hour 29 Weather 界面 数据源采用上次取得的杭州天气的json. ...
- SQLServer2008 和SQLServer2008 R2版本导出 数据库结构和数据sql
①SQLServer2008 版本导出 数据库结构和数据sql ②SQLServer2008R2 版本导出 数据库结构和数据sql 采集 #HUABAN_WIDGETS .HUABAN-red-nor ...
- Android图形基础
Android图形基础 Android在其android.graphics包中提供了完整的本机二维图像库. Color类,代表颜色,是用4个数字表示的,透明度.红色.绿色和蓝色(Alpha.Red.G ...
- 无法获得锁 /var/lib/dpkg/lock - open (11: 资源临时不可用)
转自:http://www.cnblogs.com/ManMonth/archive/2010/01/14/1648010.html 问题: 运行程序更新时出现报错: 无法获得锁 /var/lib/d ...
- js:语言精髓笔记1--标识符与基本类型
标识符: 命名: 语法以及类型----语法关键字 //逻辑 值(的存储位置)----变量和常量 ...
- Xamarin.Android编译提示找不到mscorlib.dll.so文件
Xamarin.Android编译提示找不到mscorlib.dll.so文件 错误信息:AOT module ‘mscorlib.dll.so’ not found: Cannot load lib ...