求助一道算法题。求思路。由一个 0 和 1 组成的矩阵,求出所有 1 构成的阶梯。

2017-08-18 20:08:44 +08:00
 letianqiu

初步发现 size * (steps + 1) - steps = n,如果对于每一个元素都枚举一遍,感觉复杂度非常高,而且会重复,比如 size 为 2 的可能是 size 为 3 的其中一部分。求指导

4501 次点击
所在节点    程序员
33 条回复
shard
2017-08-18 20:25:56 +08:00
动态规划
menc
2017-08-18 20:29:51 +08:00
这是一道回溯法的题啊,
只不过加了一个向右和向下的 step 必须一致的约束不是么
letianqiu
2017-08-18 20:33:58 +08:00
@menc 能否更加详细一点。要把所有的阶梯都找到, 感觉回溯只能找到一条最长的,而且如何避免重复呢。
letianqiu
2017-08-18 20:37:21 +08:00
@shard 能否具体一点。
Magentaize
2017-08-18 20:40:58 +08:00
行最简形矩阵
shard
2017-08-18 20:44:37 +08:00
没审题,我沙壁。请无视
bjrjk
2017-08-18 22:31:06 +08:00
@shard 一楼说的就很对很好,就是动态规划
geelaw
2017-08-18 22:44:16 +08:00
预处理每个位置开始往右往下可以有多少个 1,然后递推找出每个位置是否是某个阶梯的结束位置
hezhe
2017-08-19 00:54:45 +08:00
能否使用 dfs?找到的点标记下,但有的点有又可能会出现新的阶梯中,要分类判断下。
hxndg
2017-08-19 02:49:43 +08:00
好久没做题了。。。总感觉回溯或者搜索都必须注意时间复杂度啊,总感觉会爆栈
Xs0ul
2017-08-19 03:42:38 +08:00
我想的居然是卷积,怕不是学傻了(
victor97
2017-08-19 09:42:38 +08:00
首先,每行每列求前缀和,可以快速判断某条线段是否全为 1。
枚举所有位置,再枚举长度,向左上方找。
因为不考虑重复,所以要找仅 1 step 的阶梯即可。
总复杂度 O(n³)
letianqiu
2017-08-19 09:50:07 +08:00
@victor97 需要考虑重复。当前我能想到的就是对每一个元素枚举,从 size 和 step 分别增长,找到存在的阶梯之后,比较是不是 map 里已有的 path 的其中一部分,如果是,就说明是重复的,放弃这条 path, 否则记录下 path,扔到 map 里。感觉复杂度至少 O(n^4)
victor97
2017-08-19 09:56:22 +08:00
是 起点相同,size 相同,step 不同 算重复吗,
还是我理解错了重复的意思?
letianqiu
2017-08-19 10:36:36 +08:00
@victor97 算重复。这种情况下,只需要保留 steps 最大的。
victor97
2017-08-19 10:57:42 +08:00
我的意思其实也是重复的只算一次。
从左至右,从上到下,枚举位置,那么只要判断左上方一个台阶就够了。
如果要记录位置长度,再找到满足要求的更新坐标;如果不记录位置长度,只找一阶的数量就是答案。
letianqiu
2017-08-19 11:16:18 +08:00
@victor97 不是很明白你的意思诶。我算法水平太弱了。为什么只判断左上方一个台阶就可以。我的想法很初级,就是枚举每一个位置,往右下方走,size 从最小的 2 开始,step 从 1 开始,所有 step 找遍之后。size 增加。但是觉得这样有很多重复的。比如一个全都是 1 的 matrix,从( 0,0 )开始可以走到底,当从( 1,1 )开始走时,很多路径其实在( 0,0 )的时候都走过了, 属于无效的。
victor97
2017-08-19 11:26:47 +08:00
因为左上方的所有位置都是统计过的,如果发现能组成一阶台阶,要么是新出现的台阶,要么之前就已经是台阶了,只是长度 + 1,算重复。
letianqiu
2017-08-19 11:33:46 +08:00
@victor97 明白了。不过你说的求前缀和有什么用,就算知道了某列或者某行全为 1,并不能说明什么啊。还是需要枚举每一个位置。
letianqiu
2017-08-19 11:50:37 +08:00
@victor97 还有个问题,怎么区分是新台阶还是长度+1 的旧台阶。是不是和我原始的想法类似,开 map 保留所有已知的台阶构造,如果不是新台阶,那么当前位置(x, y)的上方(x-1, y)和左上方(x-1, y-1)是属于已经存在的台阶的构造的一部分,此时将原始台阶的长度+1,否则就是新台阶,加入 map

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/384039

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX