求教算法高手,最优矩阵划分

OldWaterKing 2006-09-06 05:19:50
一个m*n的0,1矩阵,要求将其划分成多个子阵,使每个子阵要么只包含0,要么只包含1。并使子阵数目最少。
...全文
537 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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
  • 打赏
  • 举报
回复
我也想知道~~

33,027

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧