[ 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 ...
随机推荐
- Orcle定时生成表数据作业
--建表 create table table41( id ) not null, --主键 col1 ), col2 ), col3 ), col4 int, col5 timestamp, col ...
- 表面看是营销书,事实上是励志书——Leo鉴书77
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvam9iY2hhbmNlbGVv/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...
- onenstack 简介
一.云计算的前世今生 所有的新事物都不是突然冒出来的,都有前世和今生.云计算也是IT技术不断发展的产物. 要理解云计算,需要对IT系统架构的发展过程有所认识. 请看下 IT系统架构的发展到目前为止大致 ...
- ios打包静态库
1. 什么是库? 所谓库就是程序代码的集合,是共享程序代码的一种方式. 2. 库的分类 根据程序代码的开源情况,库可以分为两类 开源库源代码是公开的,你可以看到具体实现.比如GitHub上比较出名的第 ...
- 12.解决CCScale9Sprite或者CCControlButton无法使用的问题。
问题: 使用CCScale9Sprite或者CCControlButton等控件的时候,会出现无法识别的情况. 解决方式: 1.include对应的头部,即#include "cocos-e ...
- android深入之设计模式(一)托付模式
(一)托付模式简单介绍 托付模式是主要的设计模式之中的一个.托付.即是让还有一个对象帮你做事情. 更多的模式,如状态模式.策略模式.訪问者模式本质上是在更特殊的场合採用了托付模式. 托付模式使得我们能 ...
- CSS总结01
1 CSS 的作用是? 2 如何引入 CSS 样式? 3 CSS 选择器的基本类型和复合选择器分别是? 4 字体.背景.列表和链接和鼠标的属性有哪些? 5 如何理解盒子模型? 6 浮动的方式有哪些,如 ...
- YTU 2516: 剪刀石头布
2516: 剪刀石头布 时间限制: 1 Sec 内存限制: 128 MB 提交: 193 解决: 123 题目描述 小慧小时候很喜欢和她的小伙伴们一起玩剪刀(Scissors).石头(Rock). ...
- Mac系统打开命令行终端及查看操作系统版本号的方法
Mac系统打开命令行终端的方法: 应用程序 --> 实用工具 --> 终端 Mac系统终端查看操作系统版本号的方法: 输入:#more /System/Library/CoreServic ...
- POJ2115 C-Loop
传送门 这道题是求解不定方程的一道好练习题. 题目描述的很诡异……还说什么k进制,其实就是要求一个数A,每次加C,问到B要加多少次,所有的数对2k取模. 也就是说我们能列出如下方程:A+xC ≡ B ...