题意:曼哈顿距离是指:|x1-x2|+|y1-y2|,只要知道这个概念题意就懂了。

分析:这道题与前面做的几道题有所不同,因为当前行不仅与前一行有关,而且与前两行有关,所以我们开数组的时候还要记录前两行的状态,所以我们需要开设三维数组。

代码实现:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std; int n,m,a[];
int dp[][][],st[],num,b[]; int suan(int x)
{
int sum=,i;
for(i=; i<=; i++)
{
if((x&))
sum++;
x=x>>;
}
return sum;
} void chushihua()
{
int i,max=<<;
for(i=; i<max; i++)
if((i&(i<<))==&&(i&(i>>))==)
{
st[num]=i;
b[num++]=suan(i);
}
} void solve()
{
int i,j,k,l,p=,max=<<m,res=,temp;
memset(dp,,sizeof(dp));
if(n>=)
for(i=; i<num&&st[i]<max; i++)
{
if((a[]&st[i])!=st[i])
continue;
temp=b[i];
dp[][][i]=temp;
}
if(n>)
{
p=p^;
for(i=; i<num&&st[i]<max; i++)
{
if((a[]&st[i])!=st[i])
continue;
temp=b[i];
for(j=; j<num&&st[j]<max; j++)
{
if((a[]&st[j])!=st[j])
continue;
if((st[i]&(st[j]<<))!=||(st[i]&(st[j]>>))!=)
continue;
if(dp[][j][i]<dp[][][j]+temp)
dp[][j][i]=dp[][][j]+temp;
}
}
for(i=; i<=n; i++)
{
p=p^;
for(j=; j<num&&st[j]<max; j++)
{
if((a[i]&st[j])!=st[j])
continue;
temp=b[j];
for(k=; k<num&&st[k]<max; k++)
{
if((st[j]&(st[k]<<))!=||(st[j]&(st[k]>>))!=)
continue;
if((a[i-]&st[k])!=st[k])
continue;
for(l=; l<num&&st[l]<max; l++)
{
if((a[i-]&st[l])!=st[l])
continue;
if((st[k]&(st[l]<<))!=||(st[k]&(st[l]>>))!=)
continue;
if((st[l]&st[j])!=)
continue;
if(dp[p][k][j]<dp[-p][l][k]+temp)
dp[p][k][j]=dp[-p][l][k]+temp;
}
}
}
}
}
for(i=; i<num&&st[i]<max; i++)
for(j=; j<num&&st[j]<max; j++)
{
temp=dp[p][i][j];
if(temp>res)
res=temp;
}
printf("%d\n",res);
} int main()
{
int i,j,temp;
num=;
memset(b,,sizeof(b));
chushihua();
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(a,,sizeof(a));
for(i=; i<=n; i++)
{
a[i]=;
for(j=; j<=m; j++)
{
scanf("%d",&temp);
a[i]=(a[i]<<)+temp;
}
}
solve();
}
return ;
}

hdu 4539(状态压缩dp)的更多相关文章

  1. HDU 1074 (状态压缩DP)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1074 题目大意:有N个作业(N<=15),每个作业需耗时,有一个截止期限.超期多少天就要扣多少 ...

  2. HDU 3341 状态压缩DP+AC自动机

    题目大意: 调整基因的顺序,希望使得最后得到的基因包含有最多的匹配串基因,使得所能达到的智商最高 这里很明显要用状态压缩当前AC自动机上点使用了基因的情况所能达到的最优状态 我最开始对于状态的保存是, ...

  3. hdu 4284 状态压缩dp

    题意: 有N 个点的无向图,要去其中 h个地点做事,做事需要先办理护照,之后可以挣一定数量的钱,知道了一开始有的总钱数,和 一些城市之间           道路的花费,问可不可以在 指定的 h 个城 ...

  4. hdu 2167 状态压缩dp

    /* 状态转移方程:dp[i][j]=Max(dp[i][j],dp[i-1][k]+sum[i][j]); */ #include<stdio.h> #include<string ...

  5. HDU 4856 (状态压缩DP+TSP)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4856 题目大意:有一个迷宫.迷宫里有些隧道,每个隧道有起点和终点,在隧道里不耗时.出隧道就耗时,你的 ...

  6. HDU 4640 状态压缩DP 未写完

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4640 解题思路: 首先用一个简单的2^n*n的dp可以求出一个人访问一个给定状态的最小花费,因为这i个 ...

  7. 2016"百度之星" - 初赛(Astar Round2A)1002 / HDU 5691 状态压缩DP

    Sitting in Line Problem Description   度度熊是他同时代中最伟大的数学家,一切数字都要听命于他.现在,又到了度度熊和他的数字仆人们玩排排坐游戏的时候了.游戏的规则十 ...

  8. HDU 5067 (状态压缩DP+TSP)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5067 题目大意:蓝翔挖掘机挖石子.把地图上所有石子都运回起点,问最少耗时. 解题思路: 首先得YY出 ...

  9. hdu 1074(状态压缩dp+记录路径)

    题意:给了n个家庭作业,然后给了每个家庭作业的完成期限和花费的实践,如果完成时间超过了期限,那么就要扣除分数,然后让你找出一个最优方案使扣除的分数最少,当存在多种方案时,输出字典序最小的那种,因为题意 ...

随机推荐

  1. 16_采用SharedPreferences保存用户偏好设置参数

    按钮事件 <Button android:id="@+id/button" android:layout_width="wrap_content" and ...

  2. javascript whenReady

    var whenReady=(function(){ var funcs=[]; var ready=false; function handler(e){ if (ready) { return; ...

  3. Kernel rest_init相关

    Linux系统里,有些进程只有kernel部分的代码,即由一个kernel函数进入,在sched的时候,将其与用户进程同等对待. PID为0的叫swapper或sched进程,对应函数为rest_in ...

  4. 了解thinkphp(二)

    ThinkPHP的核心文件: Library文件夹下的Think文件夹目录 ThinkPHP的入口文件是: ThinkPHP.php , 我们在创建项目时都要引入这个入口文件!!! 一 , 项目的部署 ...

  5. How do I install uudecode?

    uudecode is in the package sharutils Install it with the package manager or start a terminal and typ ...

  6. leetcode:Invert Binary Tree

    Invert a binary tree. 4 / \ 2 7 / \ / \ 1 3 6 9 to 4 / \ 7 2 / \ / \ 9 6 3 1即反转二叉树,代码如下: /** * Defin ...

  7. Java类的初始化过程及清理

    一.类的数据成员初始化 Java中类的数据成员初试化可能有两种形式. 在定义类成员变量的地方直接提供初始化值(这是C++中不允许的) 在构造器中初试化.(Java中不存在类似C++中的初始化列表) 两 ...

  8. hibernate自动生成映射文件

    映射文件是O/R Mapping的关键,相当于控制中心.当数据库表较多时,手动配置该映射文件非常耗时.为了快速开发程序,使开发人员的注意力集中到业务逻辑上来,Hibernate官方提供的MiddleG ...

  9. oracle数据库导入导出命令!

    Oracle数据导入导出imp/exp 功能:Oracle数据导入导出imp/exp就相当与oracle数据还原与备份. 大多情况都可以用Oracle数据导入导出完成数据的备份和还原(不会造成数据的丢 ...

  10. Linux同步机制 - 基本概念(死锁,活锁,饿死,优先级反转,护航现象)

    死锁(deadlock) 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进 ...