- 主题:求一个题目的非暴力算法
题目: 给定前N个自然数的一个乱序排列, 比如 3 1 2, 求能让其顺序排列的最小操作次数。其“操作”只有一种,即对任何一个子序列反序。 所以,312,需要操作两次 312-》321-》123。输出2.
输入4321 ,输出1.
目前只想到一个比较费时间, 特别费空间的算法:
原始输入序列压入队列,同时记录操作次数为0。
while (队列非空):
弹出队列头和当前操作次数。
两重循环遍历该当前序列的所有子序列:
反序该子序列
if(顺序了):
返回当前操作次数 + 1
结束
else:
把(得到的新序列,当年操作次数+1)压入队列
有没有经济一点的办法?
--
FROM 81.157.216.*
是要首先建立一个图吗?
3个数的序列就是1000个节点,10个数就是10亿个节点?
然后求最短路径?
【 在 cafitren 的大作中提到: 】
: 你是要找两个点(312 和123)的最短距离。可以用网络图的最短距离查找的算法。
:
--
FROM 81.157.216.*
感觉跟我上面的算法等价啊
我那个就是每次走一步, 走到了就退出, 没走到就要记录现场,然后继续。。。。。
【 在 cafitren 的大作中提到: 】
: 是的,但是你不需要显式地事先把图建起来,可以边算距离边加点。
: 最坏情况可能会相当于把这些节点都建了,但是平均情况应该只要建一小部分。
:
--
FROM 81.157.216.*
我昨天躺床上也想到这个了, 后来想到了这个反例:
10 1 2 3 4 5 6 7 8 9
【 在 zhutou3 的大作中提到: 】
: 每次把未处于应处位置的最小的数翻转到他应该处的位置,比如3 1 2->1 3 2-> 1 2 3。2 3 4 5 6 1->1 6 5 4 3 2 -> 1 2 3 4 5 6
: 没想到怎么证明这是最少步数,但也没发现反例
: ========================================
: ...................
--
FROM 86.188.38.*
微软好像是只能反转前面的子序列, 不是任意子序列。
那样分之少好多。 时间空间都降了一阶
【 在 lengxinyi 的大作中提到: 】
: 这不就是微软的翻饼问题么
: 基本就动态规划、贪心、分支限界法几种
: 你这个算法如果能剪枝的话会稍快一点
: ...................
--
FROM 86.188.38.*
3
【 在 Jangbi 的大作中提到: 】
: 先来个简单的吧:562431, 需要几步?
:
--
FROM 86.189.131.*
我没说先排1或6啊
【 在 Jangbi 的大作中提到: 】
: 嗯,这个就是找到的一个反例,证明不能先排1或者6
:
--
FROM 86.189.131.*