[ 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 ...
随机推荐
- Redis基于Java的客户端SDK收集
如果要找这类的SDK,第一反应应该直奔官网,找一下看下有什么推荐.先找最权威的回答,找不到再尝试民间方案. 就Redis来说,官方已经提供了一个列表包括市面上绝大多数语言的SDK,可以参考以下网址看J ...
- mysql设置datetime默认值为now
mysql设置datetime默认值为now MYSQL-TIMESTAMP数据类型的默认值与自动更新问题 http://blog.csdn.net/scogeek/article/details/5 ...
- list.ensureCapacity竟然会变慢
list.ensureCapacity竟然会变慢 jdk1.8 应该是做了优化了: public class Test10 { public static void main(String[] arg ...
- Silverlight+WCF实现跨域调用
在这篇文章中.WCF扮演server,向外提供LoginVaild服务.Silverlight扮演client.调用WCF提供的LoginVaild服务.思路有了.以下进行代码实现. 数据库脚本实现 ...
- Justinmind使用教程(2)——计算表达式及条件用法
Justinmind的计算表达式以及条件condition的使用对于刚開始学习的人而言比較麻烦. 结合网上了一个教程本文主要针对计算器演示样例进行计算表达式以及条件的使用. 实现目标:依据单位价格(静 ...
- 有时候当你改动了xib   你调试,各种改的时候又没变化的时候
当你xib 改变了 调试的时候又没变化的时候,当你各种改错无用的时候,就是xcode xib的缓存问题了. please clear xcode . command + shift + K . ...
- office文档、图片、音/视频格式转换工具
1.音频/视屏转换工具VLC https://wiki.videolan.org/Mp3/#Container_formats http://wenku.baidu.com/view/ba73ac5 ...
- Interfaces (C# Programming Guide)
https://msdn.microsoft.com/en-us/library/ms173156.aspx An interface contains definitions for a group ...
- go语言---for range
学习-go语言坑之for range https://www.cnblogs.com/hetonghai/p/6718250.html go只提供了一种循环方式,即for循环,在使用时可以像c那样使用 ...
- POJ2115 C-Loop
传送门 这道题是求解不定方程的一道好练习题. 题目描述的很诡异……还说什么k进制,其实就是要求一个数A,每次加C,问到B要加多少次,所有的数对2k取模. 也就是说我们能列出如下方程:A+xC ≡ B ...