[ GDOI 2014 ] 拯救莫莉斯
\(\\\)
\(Description\)
有一个 \(N\times M\) 的网格,每个格点都有权值,图是四连通的。
现在选择一个点集,使得每个格点要么被选中,要么连通的点之一被选中。
求这个点集的权值和最小值,在保证前两条满足的前提下,点集大小最小是多少。
- \(N\times M\le 50,\ M\le N\)
\(\\\)
\(Solution\)
状压入门题目。
注意到在题面的限制条件下,\(M\) 最大是\(7\),我们不妨状压每一行的情况。
注意一个方案里一行合法的要求,那就是上、下、本行和本行左右移的方案或起来得到的二进制位是满的。
那么我们状态里就不能只记录当前行了,因为无法确定是否合法。
设 \(f[i][S][S_1]\) 表示第 \(i\) 行放置方案为 \(S\) ,第 \(i-1\) 行放置方案为 \(S_1\) ,前 \(i-1\) 行都合法的前提下 的最优解。
那么注意到一行的确定是由三行确定的,所以我们需要枚举行数 \(i\) ,第 \(i-2\) 行的放置情况 \(S_2\) ,第 \(i-1\) 行的放置情况 \(S_1\) ,第 \(i\) 行的放置情况 \(S\) ,转移条件自然是
\]
然后状态维护一个结构体,手写一个结构体取 \(min\) 就好了。
注意初始化,有答案的应该只有 \(f[1][k][0]\),其他都要置成 \(inf\) 。
注意答案的选取,合法的答案需要满足 \(S_1|S|(S<<1)|(S>>1)\ \ge\ (1<<M)-1\) 。
同行左右移的辅助一开始忘记了,状态压缩类型的题目还是要注意考虑全面。
\(\\\)
\(Code\)
#include<cmath>
#include<cstdio>
#include<cctype>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 51
#define R register
#define gc getchar
#define inf 2000000000
using namespace std;
inline int rd(){
int x=0; bool f=0; char c=gc();
while(!isdigit(c)){if(c=='-')f=1;c=gc();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=gc();}
return f?-x:x;
}
int n,m,lim,mp[N][10],cost[N][1<<8],cnt[1<<8];
struct dp{int w,cnt;}f[N][1<<8][1<<8],ans;
inline dp mn(dp x,dp y){
if(x.w!=y.w) return (x.w<y.w)?x:y;
return (x.cnt<y.cnt)?x:y;
}
int main(){
n=rd(); m=rd(); lim=(1<<m)-1;
for(R int i=1;i<=n;++i)
for(R int j=0;j<m;++j) mp[i][j]=rd();
for(R int i=1;i<=n;++i)
for(R int j=0;j<=lim;++j)
for(R int k=0;k<m;++k) if(j&(1<<k)) cost[i][j]+=mp[i][k];
for(R int i=0;i<=lim;++i)
for(R int j=0;j<m;++j) if(i&(1<<j)) ++cnt[i];
for(R int i=0;i<=n;++i)
for(R int s=0;s<=lim;++s)
for(R int s1=0;s1<=lim;++s1)
f[i][s][s1].w=f[i][s][s1].cnt=inf;
for(R int i=0;i<=lim;++i){
f[1][i][0].w=cost[1][i];
f[1][i][0].cnt=cnt[i];
}
for(R int i=2;i<=n;++i)
for(R int s=0;s<=lim;++s)
for(R int s1=0;s1<=lim;++s1)
for(R int s2=0;s2<=lim;++s2)
if(((s|s1|s2|(s1<<1)|(s1>>1))&lim)==lim)
f[i][s][s1]=mn(f[i][s][s1],(dp){f[i-1][s1][s2].w+cost[i][s],f[i-1][s1][s2].cnt+cnt[s]});
ans.w=ans.cnt=inf;
for(R int s1=0;s1<=lim;++s1)
for(R int s2=0;s2<=lim;++s2)
if(((s1|s2|(s1<<1)|(s1>>1))&lim)==lim) ans=mn(ans,f[n][s1][s2]);
printf("%d %d",ans.cnt,ans.w);
return 0;
}
[ GDOI 2014 ] 拯救莫莉斯的更多相关文章
- 拯救莫莉斯[GDOI2014]
时间限制:1s 内存限制:256MB 问题描述 莫莉斯·乔是圣域里一个叱咤风云的人物,他凭借着自身超强的经济头脑,牢牢控制了圣域的石油市场. 圣域的地图可以看成是一个n*m的矩阵.每个整数坐标 ...
- [GDOI2014]拯救莫莉斯 状压DP
题面: 莫莉斯·乔是圣域里一个叱咤风云的人物,他凭借着自身超强的经济头脑,牢牢控制了圣域的石油市场. 圣域的地图可以看成是一个n*m的矩阵.每个整数坐标点(x , y)表示一座城市( 1\le x\l ...
- [GDOI2014]拯救莫莉斯
题目描述 莫莉斯·乔是圣域里一个叱咤风云的人物,他凭借着自身超强的经济头脑,牢牢控制了圣域的石油市场. 圣域的地图可以看成是一个n*m的矩阵.每个整数坐标点(x , y)表示一座城市吗,两座城市间相邻 ...
- 拯救莫莉斯 状压dp
题目大意:每个点有费用,要求选出花费最少的一些点,使得全部点都满足:他被选或与他相邻的任意点被选. 没看清数据范围233333 和翻格子游戏一样,考虑上中下三行,可行才能转移 f[i][j][k]表示 ...
- 【[GDOI2014]拯救莫莉斯】
可能我的状态比较鬼畜,应该没有人这么写 设\(dp[i][j][k]\)表示在第\(i\)行,放置油库的状态为\(j\),实际上周围已经有油库或者本身有油库的状态为\(k\)的时候的最小花费 由于我们 ...
- 暑假集训D13总结
考试 又炸掉了= = 本来看着题就一脸茫然,默默的打暴力骗分,然后就交了卷= = 重要的是,在本机跑的毫无障碍的T3程序竟然在评测机CE啊喂,35分就没了啊喂(这可是比我现在分还高= =) 内心几近崩 ...
- luogu3888 GDOI2014拯救莫里斯 (状压dp)
题目描述 莫莉斯·乔是圣域里一个叱咤风云的人物,他凭借着自身超强的经济头脑,牢牢控制了圣域的石油市场. 圣域的地图可以看成是一个n*m的矩阵.每个整数坐标点(x , y)表示一座城市\(( 1\le ...
- words2
餐具:coffee pot 咖啡壶coffee cup 咖啡杯paper towel 纸巾napkin 餐巾table cloth 桌布tea -pot 茶壶tea set 茶具tea tray 茶盘 ...
- python爬虫爬取全球机场信息
--2013年10月10日23:54:43 今天需要获取机场信息,发现一个网站有数据,用爬虫趴下来了所有数据: 目标网址:http://www.feeyo.com/airport_code.asp?p ...
随机推荐
- windows-nginx安装与运行静态资源
windows-nginx 官网 http://nginx.org/en/docs/windows.html 点击跳转 安装包下载 http://nginx.org/en/download.html ...
- Restful 级别划分以及HATEOAS是什么?
Restful简介 Rest是一种软件架构风格.设计风格,而不是标准,只是提供了一组设计原则和约束条件.它主要用于客户端和服务器交互类的软件.基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存 ...
- ETL增量单表同步简述_根据timestamp增量
ETL增量单表同步简述 1. 实现需求 当原数据库的表有新增.更新.删除操作时,将改动数据同步到目标库对应的数据表. 2. 设计思路 设计总体流程图如下: 步骤简单说明: 1.设置job的执行属性,如 ...
- 条款八: 写operator new和operator delete时要遵循常规
自己重写operator new时(条款10解释了为什么有时要重写它),很重要的一点是函数提供的行为要和系统缺省的operator new一致.实际做起来也就是:要有正确的返回值:可用内存不够时要调用 ...
- centos 建立Clamav自动扫描脚本
vim autoscan.sh #建立自动扫描脚本 #!/bin/bash PATH=/usr/bin:/bin CLAMSCANTMP=`mktemp` clamdscan --recursive ...
- hdu oj 3127 WHUgirls(2009 Asia Wuhan Regional Contest Online)
WHUgirls Time Limit: 3000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total ...
- hadoop(九) - hbase shell命令及Java接口
一. shell命令 1. 进入hbase命令行 ./hbase shell 2. 显示hbase中的表 list 3. 创建user表,包括info.data两个列族 create 'user' ...
- C#在Linux下获取文件夹信息(所在磁盘总大小,使用空间,已用空间,使用率)
1.第一种使用shell命令实现: private DiskInfo LinuxGetFolderDiskInfo(string path) { DiskInfo disk = new DiskInf ...
- Python中flatten用法
Python中flatten用法 原创 2014年04月16日 10:20:02 标签: Python / flatten 22667 一.用在数组 >>> a = [[1,3],[ ...
- 通过java类文件识别JDK编译版本号
类文件里第5,6.7,8四个字节是jDK版本信息.当中5,6为小版本:7,8为大版本. 大版本号号相应JDK版本号例如以下: JDK版本 7,8字节 JDK8 52(0x34) JDK7 51(0x3 ...