社区
数据结构与算法
帖子详情
求教算法高手,最优矩阵划分
OldWaterKing
2006-09-06 05:19:50
一个m*n的0,1矩阵,要求将其划分成多个子阵,使每个子阵要么只包含0,要么只包含1。并使子阵数目最少。
...全文
537
18
打赏
收藏
求教算法高手,最优矩阵划分
一个m*n的0,1矩阵,要求将其划分成多个子阵,使每个子阵要么只包含0,要么只包含1。并使子阵数目最少。
复制链接
扫一扫
分享
转发到动态
举报
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
打赏
举报
回复
我也想知道~~
【线性回归类
算法
的建模与评估】
讲解线性回归类
算法
的建模与评估
目标检测YOLO实战应用案例100讲-基于AE-YOLOv3的船舶目标检测与跟踪
算法
研究(续)
YOLOv1
算法
作为YOLO系列的开山之作,具有深远的意义,其提出将图像进行 单元格
划分
,通过每个单元格进行目标的检测,同时作为一种端到端的目标检测
算法
, 在训练过程中使用反向传播方法进行参数更新。这些突出的...
程序员笔试知识点整理(C/C++)
排序:排序有几种,各种排序的比较,哪些排序是稳定的,快排的
算法
; B. 查找:哈希查找、二叉树查找、折半查找的对比,哈希映射和哈希表的区别? C. 链表和数组的区别,在什么情况下用链表什么情况下用数组? ...
数据结构
排序:排序有几种,各种排序的比较,哪些排序是稳定的,快排的
算法
; B. 查找:哈希查找、二叉树查找、折半查找的对比,哈希映射和哈希表的区别? C. 链表和数组的区别,在什么情况下用链表什么情况下用数组? D...
程序员笔试知识点整理
排序:排序有几种,各种排序的比较,哪些排序是稳定的,快排的
算法
; B. 查找:哈希查找、二叉树查找、折半查找的对比,哈希映射和哈希表的区别? C. 链表和数组的区别,在什么情况下用链表什么情况下用数组? ...
数据结构与算法
33,027
社区成员
35,335
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章