HDU2167 Pebbles(状压DP)
题目给一张n×n的格子,每个格子都有数字,要从格子中取若干个数字,八个方向相邻的数字不能一起取,问取的数字最大和是多少。
从第一行一行一行看下去,可以发现第1行取哪几列只会影响到第2行,第3行后面的一点影响都没有。即第i行的决策只受i-1行决策的影响。
那么自然想到状态DP——
- dp[i][S]前i行其中第i行取的列的集合是S的取数最大和
- dp[i][S]=max(dp[i-1][S'])+集合S数字和(S是S'的合法的下一行的取法)
虽然题目n最多15,集合S就215种状态,但事实上合法的(不能同时取同一行相邻的两列数字)集合S状态只有1000多个。枚举即可转移,为了保证时间复杂度做一些预处理就行了。
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
int read(char *&s){
int res=-;
sscanf(s,"%d",&res);
while(*s==' ') ++s;
while(*s>='' && *s<='') ++s;
while(*s==' ') ++s;
return res;
}
int n,a[][],d[][<<],sta[<<],sn;
bool isok(int s){
for(int i=; i<n; ++i){
if(((s>>i-)&) && ((s>>i)&)) return ;
}
return ;
}
bool isok(int x,int y){
for(int i=; i<n; ++i){
if(((x>>i)&)==) continue;
if((y>>i)&) return ;
if(i> && ((y>>i-)&)) return ;
if(i<n- && ((y>>i+)&)) return ;
}
return ;
}
int main(){
char str[];
while(gets(str) && *str){
n=;
char *s=str; int t;
while(t=read(s),t!=-) a[][n++]=t;
for(int i=; i<n; ++i){
gets(str); s=str;
for(int j=; j<n; ++j) a[i][j]=read(s);
}
sn=;
for(int i=; i<(<<n); ++i){
if(isok(i)) sta[sn++]=i;
}
memset(d,,sizeof(d));
for(int i=; i<sn; ++i){
for(int j=; j<n; ++j){
if((sta[i]>>j)&) d[][sta[i]]+=a[][j];
}
}
vector<int> vec[];
for(int i=; i<sn; ++i){
for(int j=; j<sn; ++j){
if(isok(sta[i],sta[j])) vec[i].push_back(j);
}
}
for(int i=; i<n; ++i){
for(int j=; j<sn; ++j){
for(int k=; k!=vec[j].size(); ++k) d[i][sta[j]]=max(d[i][sta[j]],d[i-][sta[vec[j][k]]]);
for(int k=; k<n; ++k){
if((sta[j]>>k)&) d[i][sta[j]]+=a[i][k];
}
}
}
int res=;
for(int i=; i<sn; ++i){
res=max(res,d[n-][sta[i]]);
}
printf("%d\n",res);
getchar();
}
return ;
}
HDU2167 Pebbles(状压DP)的更多相关文章
- HDU 2167 Pebbles(状压DP)
题目链接:Pebbles Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...
- BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3336 Solved: 1936[Submit][ ...
- nefu1109 游戏争霸赛(状压dp)
题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1109 //我们校赛的一个题,状压dp,还在的人用1表示,被淘汰 ...
- poj3311 TSP经典状压dp(Traveling Saleman Problem)
题目链接:http://poj.org/problem?id=3311 题意:一个人到一些地方送披萨,要求找到一条路径能够遍历每一个城市后返回出发点,并且路径距离最短.最后输出最短距离即可.注意:每一 ...
- [NOIP2016]愤怒的小鸟 D2 T3 状压DP
[NOIP2016]愤怒的小鸟 D2 T3 Description Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可 ...
- 【BZOJ2073】[POI2004]PRZ 状压DP
[BZOJ2073][POI2004]PRZ Description 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍 ...
- bzoj3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一(spfa+状压DP)
数据最多14个有宝藏的地方,所以可以想到用状压dp 可以先预处理出每个i到j的路径中最小权值的最大值dis[i][j] 本来想用Floyd写,无奈太弱调不出来..后来改用spfa 然后进行dp,这基本 ...
- HDU 1074 Doing Homework (状压dp)
题意:给你N(<=15)个作业,每个作业有最晚提交时间与需要做的时间,每次只能做一个作业,每个作业超出最晚提交时间一天扣一分 求出扣的最小分数,并输出做作业的顺序.如果有多个最小分数一样的话,则 ...
- 【BZOJ1688】[Usaco2005 Open]Disease Manangement 疾病管理 状压DP
[BZOJ1688][Usaco2005 Open]Disease Manangement 疾病管理 Description Alas! A set of D (1 <= D <= 15) ...
- 【BZOJ1725】[Usaco2006 Nov]Corn Fields牧场的安排 状压DP
[BZOJ1725][Usaco2006 Nov]Corn Fields牧场的安排 Description Farmer John新买了一块长方形的牧场,这块牧场被划分成M列N行(1<=M< ...
随机推荐
- scp 命令
复制文件: (1)将本地文件拷贝到远程 scp 文件名 用户名@计算机IP或者计算机名称:远程路径 (2)从远程将文件拷回本地 ...
- VS2010中如何查看DLL的导出接口
看<VC++动态链接库(DLL)编程深入浅出>时,里面提到使用Visual C++的Depends工具可以查看动态链接库中的导出接口.对于VC6.0,VC所带的Depends软件,在VC6 ...
- Python Template 错误
ImportError: Settings cannot be imported, because environment variable DJANGO_SETTINGS_MODULE is und ...
- 修改setup.py的源
方法一: 修改文件 ~/.pydistutils.cfg为: [easy_install] index_url = http://pypi.douban.com/simple 方法二: 直接在setu ...
- 不使用arc功能时的编译参数 –fno-objc-arc
用一些老代码时,里面总有release调用,你需要用上这个标记,不使用arc功能编译代码.我总记不住具体写法,做个记录.
- iOS国际化(Xcode5)
如何将你的app内的语言可以根据系统语言切换而切换呢?这是本篇所要解决的问题.废话先不说,上软硬件环境: 硬件:Macbook Pro 软件:Xcode 5.1 代码:https://github.c ...
- Codeforces 389B(十字模拟)
Fox and Cross Time Limit: 1000MS Memory Limit: 262144KB 64bit IO Format: %I64d & %I64u Submi ...
- C++语法 初始化列表 数组引用
只能在初始化列表initilizationlist中初始化的有: 1.const修饰的数据成员或者reference参考 2.基类的构造函数 注意,数组不能引用,亦即以下代码是不对的 void fun ...
- LESS学习笔记1
个人理解:less是一个可以写函数的css
- javaweb实现验证码功能
在javaweb的用户注册与登陆功能时,有时为了防止漏洞或者大量注册,可以使用验证码功能,下面是验证码的一个简单实现 验证码类 public class ValiImg extends HttpSer ...