[ 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 ...
随机推荐
- VMware配置从U盘启动
很遗憾,VMware的BIOS不能识别USB启动设备,即使已经把USB设备连接上去. 解决这一问题的做法是直接添加硬盘,硬盘指向物理硬盘,即USB设置. 注意:Ubuntu下要设置这一功能需要使用su ...
- linux 硬件中断调节
什么是中断 中断interrupts是指硬件主动的来告诉CPU去做某些事情.比如网卡收到数据后可能主动的告诉CPU来处理自己接受到的数据,键盘有了按键输入后会主动告知CPU来读取输入. 硬件主动的打扰 ...
- mybatis collection标签和association标签(一对多,一对一)转载
mybatis 一对一与一对多collection和association的使用 在mybatis如何进行一对一.一对多的多表查询呢?这里用一个简单的例子说明. 一.一对一 1.associati ...
- iOS_开发中遇到的那些问题_1
[自编号:60][AutoLayout中,怎样让ImageView保持固定的宽高比?比如1:1] 先将imageViewframe手动写成:宽20,高20,再勾选Aspect Ratio加入宽高比约束 ...
- 小贝_mysql 存储过程
存储过程 简要: 1.什么是存储过程 2.使用存储过程 一.存储过程 概念类似于函数,就是把一段代码封装起来.当要行这段代码的时候,能够通过调用该存储过程来实现.在封装的语句体里面.能够用if/els ...
- js制造运动的假象-------Day63
这里用的这个名称可能不合适,只是临时我也没有想起比較相应的名字来,那就这样先写吧. 首先,我先表达下我想实现的是什么效果: 想必大家都玩过,至少见过非常多小游戏,例如说超级玛丽.例如说flappy b ...
- storm与hadoop的对照
hadoop 是实现了 mapreduce 的思想,将数据切片计算来处理大量的离线数据. hadoop处理的数据必须是已经存放在 hdfs 上或者类似 hbase 的数据库中.所以 hadoop ...
- ps图片怎样实现渐变
首先我先将一副图片展示给大家: 我所做的效果是想把图片做成渐变.而不改变中间图片的颜色效果. 接下来我来说明一下我的所做思路. 首先将图片中间部分选择出来.然后复制成一个图层. 详细操作是用魔棒进行反 ...
- servlet container:tomcat jetty and undertow
1 spring boot内嵌容器支持tomcat.jetty和undertow 但是undertow性能最好,详见: https://examples.javacodegeeks.com/enter ...
- luogu 2622 关灯问题II
题目大意: 有一些灯,有些开关可以控制这些灯,给出矩阵表示控制 对于矩阵中的a i j 表示第i个开关控制第j个灯的情况 若元素为1 表示当灯开着的时候,关掉灯 若元素为0 表示无操作 若元素为-1 ...