Pebbles HDU 2167
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的更多相关文章
- HDU 2167 Pebbles(状压DP)
题目链接:Pebbles Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...
- HDU 2167 Pebbles 状态压缩dp
Pebbles Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
- HDU 2167 Pebbles
题目大意:有个N*N( 3<=N<=15 )方阵, 可从中若干个数, 使其总和最大.取数要求, 当某一个数被选, 其周围8个数都不能选. 题解:记s数组为合法状态,即没有相邻的数字同时被选 ...
- Pebbles(hdu 2167)
题意:给定一个N*N的方格,让你在里面取出一些数使其和最大,要求每一个数不能与其相邻的8个数同时取出. /* 和hdu1565差不多,只不过在更新的时候考虑斜上方的格子对该格子的影响. */ #inc ...
- 【HDU 2167】 Pebbles
[题目链接] 点击打开链接 [算法] 状压DP 先搜出一行符合的情况,然后,f[i][j]表示第i行,状态为j,能够取得的最大值,DP即可 [代码] #include<bits/stdc++.h ...
- hdu 2167(状压dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2167 思路:经典的状压dp题,前后,上下,对角8个位置不能取,状态压缩枚举即可所有情况,递推关系是为d ...
- hdu 2167(状态压缩基础题)
题意:给你一个矩阵,让你在矩阵中找一些元素使它们加起来和最大,但是当你使用某一个元素时,那么这个元素周围的其它八个元素都不能取! 分析:这是一道比较基础的状态压缩题,也是我做的第三道状态压缩的题,但是 ...
- hdu 2167 方格取数 【状压dp】(经典)
<题目链接> 题目大意: 给出一些数字组成的n*n阶矩阵,这些数字都在[10,99]内,并且这个矩阵的 3<=n<=15,从这个矩阵中随机取出一些数字,在取完某个数字后,该数 ...
- hdu 2167 状态压缩
/*与1565的解法差不多*/ #include<stdio.h> #include<string.h> int map[16][16]; int dp[2][1<< ...
随机推荐
- OpenCV2.4.5 加 Cuda5.0在vs2010下工
想用opencv结合gpu加速处理,想重新编译opencv结合cuda模块无奈总出错 在国外网站上搜到一个cmakelists比较靠谱,项目可以生成,但还没有测试程序把list贴出来 ######## ...
- python输出的高亮显示
一.语法 1.书写格式 开头部分: \033[显示方式;前景色;背景色m 结尾部分: \033[0m 例如:\033[31;1m测试的文字部分\033[0m 注意: 开头部分的三个参数:显示方 ...
- @Transactional注解详细用法
概述 事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性.Spring Framework对事务管理提供了一致的抽象,其特点如下: 为不同的事务API提供一致的编程模型, ...
- 安装python3的详细教程
环境:CentOS 7 1. 安装依赖环境 # yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-dev ...
- cnpm与npm指定有什么区别?
CNPM跟NPM用法完全一致,只是在执行命令时将故宫改为CNPM. 因为故宫安装插件是从国外服务器下载,受网络影响大,可能出现异常,如果故宫的服务器在中国就好了,所以我们乐于分享的淘宝团队干了这事来自 ...
- Swift 字符(Character)
Swift 的字符是一个单一的字符字符串字面量,数据类型为 Character. import Cocoa let char1: Character = "A" let char2 ...
- JAVA运维总结篇
写这篇文章主要目的是完成自己多年来运维JAVA应用的一个总结,相当于个人知识库,以后工作中遇到问题便于临时查阅并不断完善自己的知识体系. 上图,就知道Tomcat在JAVA容器界是多么重要. ...
- unfortunately 遗憾的是
Yet,unfortunately,when it comes to the time for you to talk about these topics in English,......(unf ...
- Qt编写数据可视化大屏界面电子看板4-布局另存
一.前言 布局另存是数据可视化大屏界面电子看板系统中的额外功能之一,主要用于有时候用户需要在现有布局上做个微调,然后直接将该布局另存为一个布局配置文件使用,可以省略重新新建布局重新来一次大的调整的工作 ...
- nc简单使用
1.安装 2.运行