社区
数据结构与算法
帖子详情
求教算法高手,最优矩阵划分
OldWaterKing
2006-09-06 05:19:50
一个m*n的0,1矩阵,要求将其划分成多个子阵,使每个子阵要么只包含0,要么只包含1。并使子阵数目最少。
...全文
640
18
打赏
收藏
求教算法高手,最优矩阵划分
一个m*n的0,1矩阵,要求将其划分成多个子阵,使每个子阵要么只包含0,要么只包含1。并使子阵数目最少。
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用AI写文章
18 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
crazy_lazy_pig
2006-10-13
打赏
举报
回复
还要找子图,累!
superarhow
2006-10-13
打赏
举报
回复
问题可简化为:值为0组成的图的最优划分和值为1组成的图的最优划分。(因为0和1不可能合并),两个图可使用相同的算法。
然后,每个图又由若干互相不连通的子图组成,对于互不连通的子图,它们也不可能合并,因此,只要找出每个连通子图的最优划分即可。
对于单个连通子图,就是一个只由横边和竖边组成的凸多边型,找出竖向切割和横向切割中块数较小的一个即可。例如:
0000000
0011000
0111100
0100100
0111100
0000000
考虑其中的1组成的图,横向切是5块,纵向切是4块,那最小切法就是4块,虽然可能也有其它切成4块的方法,但我们只要找其中一个最优的解就可以了。
对于其中0组成的图,按此算法分成两个子图来切,将所得到的答案加起来就是本题的解。
crazy_lazy_pig
2006-10-11
打赏
举报
回复
似乎能产生错误的情况就我上面列出的几种, 如果就这么几种的话, 那也好办了, 那就再增加一个标记变量, 在有可能出现这几种情况的时候设置这个标记, 并记录当前标记位的"头上的矩阵";
在扫描新的一行的时候, 如果"头上的矩阵"对应的标记变量已被标记, 则判断是否产生了那几种情形(当然要结合头上的头上的矩阵判断了), 如果产生了, 则更改原来的矩阵, 使其复合要求.
party9ly
2006-10-10
打赏
举报
回复
感觉应该有个数学方法解决!有没有经典的算法啊
crazy_lazy_pig
2006-09-29
打赏
举报
回复
得, 不写不知道, 一写, 还真发现错误了, 有几种情况还真会多算:
1. 立凸形
*##
###
*##
2. 之形
#*
##
*#
3. 卤形
*###*
#####
#***#
#####
修正方法还没想好, 大家继续讨论
crazy_lazy_pig
2006-09-29
打赏
举报
回复
好吧, 就用楼上的例子说明我的算法:
扫描第一行, 得矩阵: D1 = *, D2 = #, D3 = **
记录"头上的矩阵"组为: H1=D1, H2=D2, H3=D3
扫描第二行, 并比较"头上的矩阵", 发现没有相符的, 于是添加新矩阵D4 = ####,
并更改"头上的矩阵"为: H1=D4.
扫描第三行, 并比较"头上的矩阵", 得新增矩阵 D5=*, D6=#, D7=**.
并更改"头上的矩阵"为: H1=D5, H2=D6, H3=D7.
无更多的行, 扫描结束, 返回所得矩阵列: D1, D2, D3, D4, D5, D6, D7;
同时也可以得子阵数目最少为 7 .
证明我就不详细说了, 写全了要很多字了, 在这里不能画图也讲不太清楚. 主要思想就是分情况讨论了, 如上例中, 中间那个由 # 组成的"十字形", 无论你怎么分, 最少也得分成三个数组, 我的算法是采取的行优先的方法. 可以列举其他的情况, 也有类似的结果, 如"刀形", "口形", "凸形", "凹形"等.
flyingsnowy
2006-09-29
打赏
举报
回复
,接分。
mxfeng
2006-09-28
打赏
举报
回复
*#**
####
*#**
多少个?
weijiangshanwww
2006-09-28
打赏
举报
回复
虽然我不知道,但我觉得没那么简单,如果真的是逐行扫描,那么你怎么能保证是最少个数?
weijiangshanwww
2006-09-28
打赏
举报
回复
关注ING。
party9ly
2006-09-27
打赏
举报
回复
符号发生变化?符号是?
crazy_lazy_pig
2006-09-27
打赏
举报
回复
哦 说错了 , 应该是数字发生变化(即由1变0 或者由0变1), 其实0跟1的符号也应该认为是不同的.
party9ly
2006-09-26
打赏
举报
回复
哇,微软面试题吧,我的那个很像这个,是一套的,高手给个思路吧
crazy_lazy_pig
2006-09-26
打赏
举报
回复
这有何难? 无非就是逐行扫描嘛, 每当符号发生变化就新增一个矩阵,一行扫完就继续下一行, 如果扫出的新的矩阵刚好跟它头上的相符(列数相等,元素相同), 那么就把他接到其头上的矩阵, 如果不是就新增矩阵. 关键的问题就是处理好"头上的矩阵", 那么就弄个数组去标识它们吧.
zzwu
2006-09-13
打赏
举报
回复
这有点像组合逻辑设计的最优化问题.
yelling
2006-09-07
打赏
举报
回复
每次都找三边都是“墙”的最大矩阵,然后将这个矩阵都设成“墙”,依次取。
yyfhz
2006-09-07
打赏
举报
回复
允许行互换和列互换吗
beesharp
2006-09-06
打赏
举报
回复
我也想知道~~
MySql 多条件统计
第一种写法: select count(IF(t2.work_order_status=102 or t2.work_order_status=5,1,null)) as totalComWorkOrderNum, count(IF(t2.work_order_status=9,1,null)) as toBeTakingWorkOrderNum, count(IF...
mysql 多条件统计
https://www.cnblogs.com/1234cjq/p/7802768.html
mysql多条件count_Mysql中使用count加条件统计
Mysql中使用count加条件统计 0 753坚持奋斗2019/6/28 13:19:56江苏 南京新建一个Mysql数据表a,包含id和num两个字段[pre]mysql> create table a(id int, num int);Query OK, 0 rows affected (0.04 sec)[/pre]插入测试数据,为了看count()函数的效果,我们插入两个空数据...
mysql排序查询,多条件排序查询,聚合函数的使用,分组统计查询,
排序查询: 在条件查询后面 使用order by 字段名称 (默认)升序asc降序desc 通过年龄查询排序 select * from user2 order by age; select * from user2 order by age desc; 多条件排序。逗号隔开即可 select * from user2 order by birthday desc,age asc;
mysql 多条件统计函数_DCOUNTA数据库函数在多条件情况下是如何进行统计的?
上一例,我们学习了DCOUNT数据库函数的统计应用,本例中,我们学习一貌似该函数的函数,即DCOUNTA,仅有最后的A字母之差,请注意了哦,千万别弄错!在Excel中使用数据库函数,好处多多,其中,有一个直接性的好处就是,可以将条件直接写到单元格中,而不必写到函数的参数中;如此,在功能和应用上,有着极高的灵活性!下面我们先看一下该函数的理论知识:语法DCOUNTA(database,field,c...
数据结构与算法
33,026
社区成员
35,334
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章