hdu 1185 状压dp 好题 (当前状态与上两行有关系)
/*
状压dp
刚开始&写成&&看了好长时间T0T.
状态转移方程
dp[i][k][j]=Max(dp[i][k][j],dp[i-1][l][k]+num[i][j]);(第i行的第j个状态有上一行的第k个状态得到)
num[i][j]有两个功能,第一:判断第i行第j个状态是否合法
第二:判断第i行第j个状态的数目
*/
#include<stdio.h>
#include<string.h>
#define N 110
int dp[N][N][N];
char s[N][N];
int len;
int ss[N],ans,num[N][N];
int n,m;
int lower[20];
int f(int i,int d)
{
int k=0,j;
for(j=0; j<m; j++)
{
if(lower[j]&d&&s[i][j+1]=='H')return -1;
if(lower[j]&d&&s[i][j+1]=='P')k++;
}
return k;
}
int Max(int v,int vv)
{
return v>vv?v:vv;
}
void slove()
{
int i,j,k,l;
memset(dp,-1,sizeof(dp));
len=0;
for(i=0; i<(1<<m); i++)
{
if(((i<<1)&i)||((i<<2)&i))continue;
ss[len++]=i;
}
memset(num,-1,sizeof(num));
for(i=1; i<=n; i++)
for(j=0; j<len; j++)
{
k=f(i,ss[j]);
if(k!=-1)
num[i][j]=k;
//printf("%d %d %d\n",i,j,num[i][j]);
}
for(i=0; i<len; i++)//初始化第一行
{
num[0][i]=0;
if(num[1][i]==-1)continue;
dp[1][0][i]=num[1][i];//因为0的是否没有下面ss[j]&ss[l]的限制
if(ans<dp[1][0][i])
ans=dp[1][0][i];
}
for(i=2; i<=n; i++)
for(j=0; j<len; j++)
{
if(num[i][j]==-1)continue;
for(k=0; k<len; k++)
{
if(num[i-1][k]==-1)continue;
for(l=0; l<len; l++)
{
if(num[i-2][l]==-1)continue;
if(ss[j]&ss[k])continue;
if(ss[j]&ss[l])continue;
if(dp[i-1][l][k]==-1)continue;
dp[i][k][j]=Max(dp[i][k][j],dp[i-1][l][k]+num[i][j]);
// printf("%d %d %d %d %d %d\n",i,num[i][j],dp[i][k][j],dp[i-1][l][k],ss[j],ss[k]);
if(ans<dp[i][k][j])
ans=dp[i][k][j];
}
}
}
return ;
}
int main()
{
int i;
lower[0]=1;
for(i=1; i<=12; i++)
lower[i]=lower[i-1]*2;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=1; i<=n; i++)
scanf("%s",s[i]+1);
ans=-1;
slove();
printf("%d\n",ans);
}
return 0;
}
hdu 1185 状压dp 好题 (当前状态与上两行有关系)的更多相关文章
- HDU 4778 状压DP
一看就是状压,由于是类似博弈的游戏.游戏里的两人都是绝对聪明,那么先手的选择是能够确定最终局面的. 实际上是枚举最终局面情况,0代表是被Bob拿走的,1为Alice拿走的,当时Alice拿走且满足变换 ...
- Travel(HDU 4284状压dp)
题意:给n个城市m条路的网图,pp在城市1有一定的钱,想游览这n个城市(包括1),到达一个城市要一定的花费,可以在城市工作赚钱,但前提有工作证(得到有一定的花费),没工作证不能在该城市工作,但可以走, ...
- HDU 3001 状压DP
有道状压题用了搜索被队友骂还能不能好好训练了,, hdu 3001 经典的状压dp 大概题意..有n个城市 m个道路 成了一个有向图.n<=10: 然后这个人想去旅行.有个超人开始可以把他扔到 ...
- hdu 2167(状压dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2167 思路:经典的状压dp题,前后,上下,对角8个位置不能取,状态压缩枚举即可所有情况,递推关系是为d ...
- Doing Homework HDU - 1074 (状压dp)
Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Every ...
- hdu 2809(状压dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2809 思路:简单的状压dp,看代码会更明白. #include<iostream> #in ...
- hdu 2686(状压dp)
题目链接:http://poj.org/problem?id=2686 思路:典型的状压dp题,dp[s][v]表示到达剩下的车票集合为S并且现在在城市v的状态所需要的最小的花费. #include& ...
- Engineer Assignment HDU - 6006 状压dp
http://acm.split.hdu.edu.cn/showproblem.php?pid=6006 比赛的时候写了一个暴力,存暴力,过了,还46ms 那个暴力的思路是,预处理can[i][j]表 ...
- 【bzoj1087】【互不侵犯King】状压dp裸题(浅尝ACM-D)
[pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=54329606 向大(hei)佬(e)势力学(di ...
随机推荐
- codehunter 「Adera 6」杯省选模拟赛 网络升级 【树形dp】
直接抄ppt好了--来自lyd 注意只用对根判断是否哟留下儿子 #include<iostream> #include<cstdio> using namespace std; ...
- SAP基本搜索帮助及增强出口
se11创建基本搜索帮助时,各个参数的含意 选择方法 指定命中列表的数据来源,可以是数据库表,视图,CDS.如果指定了搜索帮助出口函数则该字段可以不输,数据来源可以在出口中自行指定 对话类型: 输 ...
- JavaScript--DOM方法
getElementsByName()方法 返回带有指定名称的节点对象的集合. 语法: document.getElementsByName(name) 与getElementById() 方法不同的 ...
- log4j2异步日志解读(二)AsyncLogger
前文已经讲了log4j2的AsyncAppender的实现[log4j2异步日志解读(一)AsyncAppender],今天我们看看AsyncLogger的实现. 看了这个图,应该很清楚AsyncLo ...
- 专题四:自定义Web浏览器
前言: 前一个专题介绍了自定义的Web服务器,然而向Web服务器发出请求的正是本专题要介绍的Web浏览器,本专题通过简单自定义一个Web浏览器来简单介绍浏览器的工作原理,以及帮助一些初学者揭开浏览器这 ...
- redis 数据类型Hash
redis的Hash数据类型: hash数据类型 Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象. 创建map: hmset map c & ...
- android开发小内容
EditText弹出输入数字:android:inputType="phone"
- IE 浏览器在地址栏输入中文字符,发送get请求报400错误的问题
因为学校有JavaWeb的课程,所以才接触这方面.最近遇到了个小问题. 先看一段很简单的jsp代码例子 <%@ page language="java" import=&qu ...
- putty源码阅读----plink
一直对ssh协议的各种客户端实现比较入迷,遍寻了很多ssh协议实现也用了很多的库,发现依赖太多 putty是最纯洁依赖第三方几乎为0的客户端实现,先从plink处开始入手. 1.putty目录 才刚开 ...
- zabbix---简介
zabbix---简介 今天又听人说zabbix,好吧特地回来看了看,和其他的好像差别也不大,不过他可以让监控,绘图,web前端与一体, 当然也可以实现分布式部署,不错的. 列举一下其功能特点 网络设 ...