求助:一个有应用背景的算法

gofor 2004-10-10 06:38:20
一个m*n矩阵,其元素值为0或1,且任意两行和两列的四个交叉元素不全为1。
以行序为主序顺序存储该矩阵时,可以把该矩阵看成一个二进制数。
假设任意两行可交换,任意两列可交换,请设计一个算法通过行交换和列交换,使这个二进制数达到最大。要求时间复杂度为多项式级。
...全文
276 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
conghonglei 2004-10-27
  • 打赏
  • 举报
回复
问题的复杂只在于 如何找出第一行第一列

其中利用 任意两行和两列的四个交叉元素不全为1 这个条件是十分重要的

1 11..........11 000000 0000..000...
1 111..1 000..0000...
1 全部为0 0同理0 11...10...
1 具体列的顺序 00...0 0同理01..10
1 由第二部分确定 000000000000000001.. 10...
1 000000 000000 00000000011..1000
0 ------------------------------
1 |第二部分
conghonglei 2004-10-26
  • 打赏
  • 举报
回复

| 1 | 2 | 3 | 4 | 5 | 6 | 7 | ....
< 首位为1 >< 首位为0....

首先确定第一个数字。(假设已有办法可确定)
确定后分为两部:[1,5), [5...]

以行数小的为优先,确定列的位置。

先求出第一部分
由于 任意两行和两列的四个交叉元素不全为1,其余部分只是计算1的个数而已,对于个数相同的,
由相应的 首位为 0 的确定。
在最后记录下,有哪些列的位置没有确定

第二部分
因为部分列已被确定,有局限,但基本上还是一个递归。
gofor 2004-10-26
  • 打赏
  • 举报
回复
第一步,显然是找出最多1的行,通过“行交换”到第1行;再通过“列交换”把第1行的元素1集中到最左边。如果最多1的行有多个,只能每行分别试了。

同上帖,现在除了第1行元素已经确定,剩下的矩阵被分成左右两部分。

第二步,接下来,似乎可以进一步一分为四,左部分中有1的行显然应该放交换到最上面,如此可分为如下四部分:
   
111.....1 000.......0   ---这是第1行
------------
     |第I部分
 单1  |  ??
 |
------------
     |第II部分
 全0  |  ??
 |

“单1”部分每行有且只有一个1

第I部分的划分似乎与第一步类似,但不是。这一部分只能如此
111.....1 000.......0    ---这是原第2行
------------
 |  |
单1|全0 |  ??     ---这是原第I部分
  | |
------------
 |  |第II部分
全0|单1 |  ??     ---这是原第II部分
 | |

问题复杂了,我头大了..... :(
gofor 2004-10-25
  • 打赏
  • 举报
回复
我也希望写出一个清晰的递归过程,但问题远非conghongler所说的那么简单,whycadi提出的算法似乎只是开始。
conghonglei 2004-10-25
  • 打赏
  • 举报
回复
第一个数是可以确定的,行1最多的那个,如果有行相同多个1,则按列最多1确定第一行第一列。

由此分为两部分,第一位为1的,和0 的。然后递归。

确定第一行第一列实际也是一个递归的过程。

个人见解,供大家参考。
mathe 2004-10-24
  • 打赏
  • 举报
回复
whycadi(保护视力)的方法已经说明的很清楚了,就剩一些补补丁丁可做了,该结贴了。
gofor 2004-10-22
  • 打赏
  • 举报
回复
还有人对这个问题有兴趣吗?:(
如果这个帖子落到第3页,我就结贴,参与讨论者都有分。
zzwu 2004-10-22
  • 打赏
  • 举报
回复
已经没有更多的可说了.
zzwu 2004-10-22
  • 打赏
  • 举报
回复
同意whycadi(保护视力)的做法.
gofor 2004-10-13
  • 打赏
  • 举报
回复
等待中...
sten 2004-10-11
  • 打赏
  • 举报
回复
我先分析一下:)
   在同一正方形(指的是如 1 0 的形式)不能同时为 1 ,且在相邻两行(列)中,不能
0 1

出现有两列(行)相同的 1 ( 1 0 0 0 1 1 1 )这样是不允许的,因为平移后会出现前一种情
1 0 1 0 0 0 1
况.不知对各位有没有帮助,剩下的思考中......!
gofor 2004-10-11
  • 打赏
  • 举报
回复
谢谢各位的参与,我有7000多分,给本贴的参与者我都会给分,对有价值的发言,我不会吝啬分数的:-)

whycadi的算法我是考虑过的,他漏了一种情况,就是每列中为1的元素可能不止两个,可能是受了我给的例子的误导。而且这个算法的时间复杂度是多项式级的吗?

不过,不妨把这个问题简化,就是再加一个限制条件:即每列中为1元素有且只有两个。

我举的例子中,变换所得的结果不是最大数,最大数应是:
1 1 0 0 0
1 0 1 0 0
1 0 0 1 0
1 0 0 0 1
0 1 1 0 0
0 1 0 1 0
0 0 1 0 1

另外,我希望哪位最好用高级语言写出完整算法:-)
whycadi 2004-10-11
  • 打赏
  • 举报
回复
先找1最多的一行(假设有A个1),把它移到第一行,并把所有的1移到最前面的列。由条件可知,其它各行在移到以后,前面A列中都只有最多1个1。然后找这些行前面A列有1,后几列中1最多的一行(假设有B个),把它移到等二行,把前面A列中为1的那一列移到第一列,把A列以后的B个有1的列移到从A+1列开始的B列,然后找在前A+B列1最多(最多两个)并且后面列中1最多的一行放到第三行…………以下过程类似。
如果某一步有多行的1数目相等,就分别选一行放在前面走几步,每走一步比较一下,比出大小来就选大的那一种走下去。
skystar99047 2004-10-11
  • 打赏
  • 举报
回复
问大学学生或老师,很快会有答案的,俺大学里学的线性代数和高等数学已经忘得差不多了。
gofor 2004-10-11
  • 打赏
  • 举报
回复
比如如下矩阵:
0 1 1 0 0
1 0 1 0 0
1 1 0 0 0
0 1 0 0 1
0 0 1 1 0
1 0 0 1 0
1 0 0 0 1
通过适当的行交换、列交换,可变成
1 1 0 0 0
1 0 1 0 0
1 0 0 0 1
1 0 0 1 0
0 1 1 0 0
0 1 0 1 0
0 0 1 0 1
按行主序顺序存储(即写第一行元素,再写第二行元素,...),则为二进制数:11000101001000110010011000101000101
求:设计一个算法,通过行交换、列交换,使这个数最大。
zzwu 2004-10-11
  • 打赏
  • 举报
回复
语言描述不容易看,请举一个具体例子先.
101monster 2004-10-10
  • 打赏
  • 举报
回复
呵呵,UP!

33,028

社区成员

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

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