\(\\\)

\(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\) ,转移条件自然是

\[S_2|S_1|(S_1<<1)|(S_1>>1)|S\ \ge\ (1<<M)-1
\]

然后状态维护一个结构体,手写一个结构体取 \(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 ] 拯救莫莉斯的更多相关文章

  1. 拯救莫莉斯[GDOI2014]

    时间限制:1s     内存限制:256MB 问题描述 莫莉斯·乔是圣域里一个叱咤风云的人物,他凭借着自身超强的经济头脑,牢牢控制了圣域的石油市场. 圣域的地图可以看成是一个n*m的矩阵.每个整数坐标 ...

  2. [GDOI2014]拯救莫莉斯 状压DP

    题面: 莫莉斯·乔是圣域里一个叱咤风云的人物,他凭借着自身超强的经济头脑,牢牢控制了圣域的石油市场. 圣域的地图可以看成是一个n*m的矩阵.每个整数坐标点(x , y)表示一座城市( 1\le x\l ...

  3. [GDOI2014]拯救莫莉斯

    题目描述 莫莉斯·乔是圣域里一个叱咤风云的人物,他凭借着自身超强的经济头脑,牢牢控制了圣域的石油市场. 圣域的地图可以看成是一个n*m的矩阵.每个整数坐标点(x , y)表示一座城市吗,两座城市间相邻 ...

  4. 拯救莫莉斯 状压dp

    题目大意:每个点有费用,要求选出花费最少的一些点,使得全部点都满足:他被选或与他相邻的任意点被选. 没看清数据范围233333 和翻格子游戏一样,考虑上中下三行,可行才能转移 f[i][j][k]表示 ...

  5. 【[GDOI2014]拯救莫莉斯】

    可能我的状态比较鬼畜,应该没有人这么写 设\(dp[i][j][k]\)表示在第\(i\)行,放置油库的状态为\(j\),实际上周围已经有油库或者本身有油库的状态为\(k\)的时候的最小花费 由于我们 ...

  6. 暑假集训D13总结

    考试 又炸掉了= = 本来看着题就一脸茫然,默默的打暴力骗分,然后就交了卷= = 重要的是,在本机跑的毫无障碍的T3程序竟然在评测机CE啊喂,35分就没了啊喂(这可是比我现在分还高= =) 内心几近崩 ...

  7. luogu3888 GDOI2014拯救莫里斯 (状压dp)

    题目描述 莫莉斯·乔是圣域里一个叱咤风云的人物,他凭借着自身超强的经济头脑,牢牢控制了圣域的石油市场. 圣域的地图可以看成是一个n*m的矩阵.每个整数坐标点(x , y)表示一座城市\(( 1\le ...

  8. words2

    餐具:coffee pot 咖啡壶coffee cup 咖啡杯paper towel 纸巾napkin 餐巾table cloth 桌布tea -pot 茶壶tea set 茶具tea tray 茶盘 ...

  9. python爬虫爬取全球机场信息

    --2013年10月10日23:54:43 今天需要获取机场信息,发现一个网站有数据,用爬虫趴下来了所有数据: 目标网址:http://www.feeyo.com/airport_code.asp?p ...

随机推荐

  1. zip4j加密压缩、解压缩文件、文件夹

    原文:http://blog.csdn.net/k21325/article/details/54376188 1.首先,引用到zip4j的第三方类库,感谢作者的无私奉献,官网打不开,这里就不贴了,下 ...

  2. 在线文档分享工具 ShowDoc

    原文:https://www.oschina.net/p/showdoc https://www.showdoc.cc/

  3. 集成环信时遇到的问题file not found: libEaseMobClientSDK.a

    集成环信时遇到的问题 build setting环信SDK集成libEaseMobClientSDKL  file not found: libEaseMobClientSDK.a clang: er ...

  4. Android中通过反射来设置Toast的显示时间

    这个Toast的显示在Android中的用途还是非常大的,同一时候我们也知道toast显示的时间是不可控的.我们仅仅能改动他的显示样式和显示的位置,尽管他提供了一个显示时间的设置方法.可是那是没有效果 ...

  5. expand_dims

    tf.expand_dims  |  TensorFlow https://tensorflow.google.cn/api_docs/python/tf/expand_dims tf.expand_ ...

  6. [译]NUnit--Installation(三)

    Installation NUnit安装程序默认安装文件路径为C:\Program Files\NUnit 2.6.2.根据用户选择安装的选项,安装文件有三个子文件夹:bin.doc.samples. ...

  7. window安装Elasticsearch

    下载,https://www.elastic.co/cn/downloads/elasticsearch 下载后解压,进入解压目录,运行./elasticsearch.bat 运行成功如下 (运行需要 ...

  8. 洛谷P3216 [HNOI2011]数学作业

    题目描述 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 N 和 M,要求计算 Concatenate (1 .. N) Mod M 的值,其中 Concatenat ...

  9. C#面向过程之编译原理、变量、运算符

    .net基础:.net与C# .net是一个平台 c#是一门语言 .net的用途a.桌面应用程序 b.网站应用程序 c.专业游戏开发(XBOX360) d.嵌入式设备软件开发 e.智能手机APP开发 ...

  10. 如何精通javascript

    http://stackoverflow.com/questions/2628672/what-should-every-javascript-programmer-know Not jQuery. ...