题意:给出一个数表,规定取出一个数后周围的八个数都不可取,求可获得的最大数字和
思路:状态压缩dp,每一行的取数方法为状态,显然,由于取数规则的限制,可取的状态并不是
1<<size_col,而是非常有限的,我们可以预处理出状态(不超过1600个),大大降低时间复杂度,
 
运行时间:140ms

#include <bits/stdc++.h>
using namespace std;
int dp[][],sta[],len,n;
int g[][];
void init()
{
for(int i=;i<(<<);i++)if(!(i&(i<<))&&!(i&(i>>)))sta[len++]=i;//预处理出所有可取状态
} int Res[][];//加个记忆化,避免重复的计算
inline int calstatus(int row,int sta,int j)//计算出row行这个状态所有数字的的sum
{
if(Res[row][j])
return Res[row][j];
int res=;
for(int j=;j<n;j++){
if(sta&)
{
res+=g[row][j];
}
sta>>=;
}
return Res[row][j]=res;
}
int main()
{
init();
while (n=,~scanf("%d",&g[][n++]))
{
memset(Res,,sizeof(Res));
memset(dp,, sizeof(dp));//初始化
//坑爹输入部分
while (true)
{
scanf("%d",&g[][n++]);
if(getchar()=='\n')break;
}
for(int i=;i<n;i++)
for(int j=;j<n;j++)scanf("%d",&g[i][j]);
//第一行预处理
for(int i=;i<n;i++)
for(int j=;j<len&&sta[j]<(<<n);j++)dp[][j]=calstatus(,sta[j],j);
int ans=;
for(int i=;i<n;i++)
{
for(int j=;j<len&&sta[j]<(<<n);j++)
{
for(int k=;k<len&&sta[k]<(<<n);k++)
if(!(sta[k]&(sta[j]<<))&&!(sta[k]&(sta[j]>>))&&!(sta[k]&sta[j])){//左移右移与不移,两个状态都不冲突,进行状态转移
dp[i][k]=max(dp[i][k],dp[i-][j]+calstatus(i,sta[k],k));
ans=max(ans,dp[i][k]);
}
}
}
printf("%d\n",ans);
}
return ;
}

HDU 2167 状压dp方格取数的更多相关文章

  1. hdu 2167(状压dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2167 思路:经典的状压dp题,前后,上下,对角8个位置不能取,状态压缩枚举即可所有情况,递推关系是为d ...

  2. HDU 4778 状压DP

    一看就是状压,由于是类似博弈的游戏.游戏里的两人都是绝对聪明,那么先手的选择是能够确定最终局面的. 实际上是枚举最终局面情况,0代表是被Bob拿走的,1为Alice拿走的,当时Alice拿走且满足变换 ...

  3. hdu 3254 (状压DP) Corn Fields

    poj 3254 n乘m的矩阵,1表示这块区域可以放牛,0,表示不能,而且不能在相邻的(包括上下相邻)两个区域放牛,问有多少种放牛的方法,全部不放也是一种方法. 对于每块可以放牛的区域,有放或者不放两 ...

  4. Travel(HDU 4284状压dp)

    题意:给n个城市m条路的网图,pp在城市1有一定的钱,想游览这n个城市(包括1),到达一个城市要一定的花费,可以在城市工作赚钱,但前提有工作证(得到有一定的花费),没工作证不能在该城市工作,但可以走, ...

  5. HDU 3001 状压DP

    有道状压题用了搜索被队友骂还能不能好好训练了,, hdu 3001 经典的状压dp 大概题意..有n个城市 m个道路  成了一个有向图.n<=10: 然后这个人想去旅行.有个超人开始可以把他扔到 ...

  6. hdu 2809(状压dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2809 思路:简单的状压dp,看代码会更明白. #include<iostream> #in ...

  7. HDU 6321 (状压dp)

    题目大意:: 为给你n个点(n<=10,nn<=10,n) 初始时没有边相连 然后有m个操作(m<=30000m<=30000) 每次可以添加一条边或删除一条边 允许有重边 要 ...

  8. [OpenJudge8786][暴力DP]方格取数

    方格取数 总时间限制: 1000ms 内存限制: 65536kB [描述] 设有N*N的方格图(N<=10),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0.如下图所示(见样例): ...

  9. Engineer Assignment HDU - 6006 状压dp

    http://acm.split.hdu.edu.cn/showproblem.php?pid=6006 比赛的时候写了一个暴力,存暴力,过了,还46ms 那个暴力的思路是,预处理can[i][j]表 ...

随机推荐

  1. go语言将函数作为参数传递

    Go语言函数作为参数传递,目前给我的感觉几乎和C/C++一致.非常的灵活. import "fmt" import "time" func goFunc1(f  ...

  2. MAC OpenGL 环境搭建

    MAC OpenGL 环境搭建 基础库介绍 先要安装两个库一个是GLEW(OpenGL Extension Wrangler Library),另外一个是GLFW(Graphics Library F ...

  3. mkdir: cannot create directory ‘/soft/hadoop-2.7.3/logs’: Permission denied问题

    启动hadoop时,报错“mkdir: cannot create directory ‘/soft/hadoop-2.7.3/logs’: Permission denied” 注:/soft/ha ...

  4. springboot启动失败( No active profile set, falling back to default profiles: default)

    问题: springboot启动失败( No active profile set, falling back to default profiles: default) 解决方法 在pom.xml文 ...

  5. git clone后切换分支,和远端的不一样。

    原因 git clone后再master分支,切换后到了别的分支,分支里面的文件目录是不一样的,导致出现错误. 解决 删除原来的全部文件 git pull 可是git pull报错, git匹配的文件 ...

  6. 5. Jmeter常用快捷键

    快捷键 功能 备注 Ctrl + C 复制 可复制组件 Ctrl + V 粘贴 可粘贴组件 Ctrl + Shift + C 复制粘贴当前组件到下一行   Ctrl + R 运行测试计划   Ctrl ...

  7. Codeforces 1172A Nauuo and Cards

    题目链接:http://codeforces.com/problemset/problem/1172/A 题意:一共有2*n张牌,n张0,n张1到n.现在随机的n张(有0有数字)在手上,另n张再牌堆中 ...

  8. 启动多个mysql实例

    如果使用./support-files/mysql.server 文件启动,则默认读取/etc/my.cnf 配置文件,这种方式有时候启动不了 会提示报错 :The server quit witho ...

  9. selenium 滑动页面至元素可见

    滚动页面 在自动化操作中,如果web页面过长,而我们需要的元素并不在当前可视页面中,那么selenium就无法对其进行操作:此时,我们就需要像平时操作浏览器一样来滚动页面,使我们需要操作的对象可见! ...

  10. umount - 卸载文件系统

    总览 umount [-hV] umount -a [-nrv] [-t vfstype] umount [-nrv] device | dir [...] 描述 umount 可以卸除当前挂载在文件 ...