Pebbles HDU 2167

大意:给定一个N*N的方格,让你在里面取出一些数使其和最大,要求每一个数不能与其相邻的8个数同时取出.

思路:和炮兵阵地那一题有点像,但我们只需要考虑上一行的情况,这要简单很多,同时每一行的合法状态数量都是一样的,只需要每次读入预处理每一行每一种合法状态对应的和即可,转移方程很好写出。

#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
using namespace std;
int a[16][16];
int state[1600];
int tot[15][1600];
int dp[16][1600];
int n,cot;
bool ok(int x){return (x & (x >> 1)) == 0;}
bool check(int now,int pre){
return (now & pre) == 0 && (now & (pre >> 1)) == 0 && (now & (pre << 1)) == 0;
}
int getsum(int x,int now){
int sum = 0;
for(int i = 0;i < n;i++){
if((now & (1 << i))){
sum += a[x][i];
}
}
return sum;
}
int main()
{
//读入比较复杂
while(~scanf("%d",&a[1][0])){
char c;
scanf("%c",&c);
n = 0,cot = 0;
while(c != '\n'){
scanf("%d",&a[1][++n]);
scanf("%c",&c);
}
n++;
for(int i = 2;i <= n;i++){
for(int j = 0;j < n;j++) {
scanf("%d",&a[i][j]);
}
}
//预处理合法状态
for(int i = 0;i < (1 << n);i++){
if(ok(i)) state[++cot] = i;
}
for(int i = 1;i <= cot;i++){
for(int j = 1;j <= n;j++){
//第j行的第i个状态对应的数字和
tot[j][i] = getsum(j,state[i]);
}
}
memset(dp,0,sizeof(dp));
for(int i = 1;i <= n;i++){
for(int j = 1;j <= cot;j++){
int s1 =state[j];
if(i == 1) {
dp[1][j] = tot[1][j];
continue;
}
for(int k = 1;k <= cot;k++){
int s2 =state[k];
if(check(s1,s2)){
dp[i][j] = max(dp[i][j],dp[i - 1][k] + tot[i][j]);
}
}
}
}
int ans = -1;
for(int i = 1;i <= cot;i++){
ans = max(ans,dp[n][i]);
}
printf("%d\n",ans);
}
return 0;
}

Pebbles HDU 2167的更多相关文章

  1. HDU 2167 Pebbles(状压DP)

    题目链接:Pebbles Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tota ...

  2. HDU 2167 Pebbles 状态压缩dp

    Pebbles Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...

  3. HDU 2167 Pebbles

    题目大意:有个N*N( 3<=N<=15 )方阵, 可从中若干个数, 使其总和最大.取数要求, 当某一个数被选, 其周围8个数都不能选. 题解:记s数组为合法状态,即没有相邻的数字同时被选 ...

  4. Pebbles(hdu 2167)

    题意:给定一个N*N的方格,让你在里面取出一些数使其和最大,要求每一个数不能与其相邻的8个数同时取出. /* 和hdu1565差不多,只不过在更新的时候考虑斜上方的格子对该格子的影响. */ #inc ...

  5. 【HDU 2167】 Pebbles

    [题目链接] 点击打开链接 [算法] 状压DP 先搜出一行符合的情况,然后,f[i][j]表示第i行,状态为j,能够取得的最大值,DP即可 [代码] #include<bits/stdc++.h ...

  6. hdu 2167(状压dp)

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

  7. hdu 2167(状态压缩基础题)

    题意:给你一个矩阵,让你在矩阵中找一些元素使它们加起来和最大,但是当你使用某一个元素时,那么这个元素周围的其它八个元素都不能取! 分析:这是一道比较基础的状态压缩题,也是我做的第三道状态压缩的题,但是 ...

  8. hdu 2167 方格取数 【状压dp】(经典)

    <题目链接> 题目大意: 给出一些数字组成的n*n阶矩阵,这些数字都在[10,99]内,并且这个矩阵的  3<=n<=15,从这个矩阵中随机取出一些数字,在取完某个数字后,该数 ...

  9. hdu 2167 状态压缩

    /*与1565的解法差不多*/ #include<stdio.h> #include<string.h> int map[16][16]; int dp[2][1<< ...

随机推荐

  1. 小程序开发:用原生还是选框架(wepy/mpvue/uni-app/taro)?

    小程序开发:用原生还是选框架(wepy/mpvue/uni-app/taro)? 自 2017-1-9微信小程序诞生以来,历经2年多的迭代升级,已有数百万小程序上线,成为继Web.iOS.Androi ...

  2. Python 调用系统命令的模块 Subprocess

    Python 调用系统命令的模块 Subprocess 有些时候需要调用系统内部的一些命令,或者给某个应用命令传不定参数时可以使用该模块. 初识 Subprocess 模块 Subprocess 模块 ...

  3. Java实现单例的5种方式

    1. 什么是单例模式 单例模式指的是在应用整个生命周期内只能存在一个实例.单例模式是一种被广泛使用的设计模式.他有很多好处,能够避免实例对象的重复创建,减少创建实例的系统开销,节省内存. 2. 单例模 ...

  4. .net core 修改 Identity/AspNetUsers 数据库

    众所周知,.net core有一套完整的用户管理功能.使用它就能实现用户的管理及登录登出功能.现在问题来了,我们有时候需要添加一些字段,该怎么办呢?当然是修改他呀.修改方法参考链接:https://m ...

  5. 如何构建自己的docker镜像

    需求情况:springboot项目想要部署到docker里面,如何部署? 步骤如下: 1.将jar包上传linux服务器 /usr/local/dockerapp 目录,在jar包所在目录创建名为 D ...

  6. IDEA版本控制工具VCS中使用Git,以及快捷键总结(不使用命令)

    场景介绍: 工作中多人使用版本控制软件协作开发,常见的应用场景归纳如下: 假设小组中有两个人,组长小张,组员小袁 场景一:小张创建项目并提交到远程Git仓库 场景二:小袁从远程Git仓库上获取项目源码 ...

  7. [MyBatis]浅谈如何实现事务处理

    要实现事务处理,就得从SqlSession中取出connection来,然后对connection采用setAutoCommit,commit,rollback等操作,最后的时候,不能像JDBC一样关 ...

  8. 记录学习Linux遇到的问题

    shl@shl-tx:~$ ifconfig Command 'ifconfig' not found, but can be installed with: sudo apt install net ...

  9. UML期末复习题——2.5:System Sequence Diagram & Post-condition

    第五题:系统顺序图 重要概念: 1.对象: 对象是特定行为与属性的集合. 对象的表示方式有三种: a.包括对象名和类名 b.只有类名. c.只有对象名 2.消息表示形式: 消息用于描述对象间交互的方式 ...

  10. x86 linux下如何交叉编译?

    答: 需要首先指定两个环境变量CROSS_COMPILE和ARCH 如交叉编译arm64的程序: export CROSS_COMPILE="aarch64-linux-gnu-" ...