codevs1050】的更多相关文章

[codevs1050]棋盘染色 2 试题描述 有一个5*N的棋盘,棋盘中的一些格子已经被染成了黑色,你的任务是对最少的格子染色,使得所有的黑色能连成一块. 输入 第一行一个整数N(<=100),接下来N行每行一个长度为5的01串,1表示所在格子已经被染成了黑色,0表示所在格子没有被染色. 输出 输出最少需要对多少个格子进行染色 输入示例 输出示例 数据规模及约定 N(<=100) 题解 状压 dp 一下.设 f(i, S) 表示考虑前 i 行,最后一行情况为集合 S 的最小代价:其中 S 是…
题目地址:http://codevs.cn/problem/1050/ 分析: 最開始想直接用状压做,发现怎么都想不出来.就和当年的多行多米诺骨牌(这道题至少最后还是把普通状压做法看懂了). 直到听到 @tsyao 神牛说这个是轮廓线状压. 大白书(LRJ算法竞赛)第六章第一节好像就是吧. 主体思路: 一.做法思路比較简单,写起来蛋疼死我了= =,用四进制来保存状态(连通性问题,第六章第三个例题算是这个题的提高).直接位运算比較方便,可是easy出错.注意运算符的优先级. 二.把整个棋盘分成5*…
题目大意:有一个5*N(≤100)的棋盘,棋盘中的一些格子已经被染成了黑色,求最少对多少格子染色,所有的黑色能连成一块. 这题卡了我1h,写了2.6k的代码,清明作业一坨还没做啊...之前一直以为这题是插头DP,结果今天一看发现不用>_<,虽然还是状压DP. 因为只有5列,所以每行至多有3个黑色联通块,即黑,白,黑,白,黑,其他的情况都少于3个联通块了,所以我们可以把联通块标号.0表示白色,1表示1号联通块,2和3同理,所以我们可以用4进制来表示每一行的状态.则下一行的黑色若与上一行的黑色连接…