Algorithm 应用变换使数组排序

Algorithm 应用变换使数组排序,algorithm,dynamic-programming,Algorithm,Dynamic Programming,我们得到M个数字,每个数字都有一个与之相关的值列表。我们可以使用列表中的任何数字来更改它(它也将仅在1到M之间) 因此,我们有(其最大尺寸为200 X 200): 现在若N=4,数组是[2,1,3,4],那个么答案是2,因为我们可以改变2->1和1->2 但如果变换相同,N=4且数组为[3,4,1,2],则答案为-1,因为我们无法对其进行排序。可以使用动态规划通过以下下一个递归公式进行求解: i是一个索引 x是可以填充每个索引的集合中的值(可以轻松转换为基于这些值的索引) 对于其他数组,需

我们得到M个数字,每个数字都有一个与之相关的值列表。我们可以使用列表中的任何数字来更改它(它也将仅在1到M之间)

因此,我们有(其最大尺寸为200 X 200):

现在若N=4,数组是[2,1,3,4],那个么答案是2,因为我们可以改变2->1和1->2


但如果变换相同,N=4且数组为[3,4,1,2],则答案为-1,因为我们无法对其进行排序。

可以使用动态规划通过以下下一个递归公式进行求解:

  • i
    是一个索引
  • x
    是可以填充每个索引的集合中的值(可以轻松转换为基于这些值的索引)

对于其他数组,需要相应地修改
orig
vals
,例如
[3,4,1,2]

orig = [3,4,1,2] 
vals = [[3,4],[3,4],[1,2],[1,2]]

在这里,
max\u int32
表示这是无法完成的-您可以轻松地将其切换到
-1

您能用一些例子来解释一下吗?我无法获得python,否则c++/java中的代码将非常有用。您是否使用基于1的索引?@Mrinal python相当简单,几乎类似于伪代码。试着把它想象成伪代码,你就会明白了。请注意:
range(x)
生成所有值[0,1,…,x-1]
i in x`是每个循环,
len(x)
是数组x的长度(java的
x.length
)和什么D=[[1,1]]?如果没有错的话,我猜这的复杂性是O(NMM)?
1->{1,2}
2->{1,2}
3->{3,4}
4->{3,4}
 D(0)(x) = 1   | x is not the original value    //1 value array is sorted
 D(0)(x) = 0   | x is the original value
 D(i)(x) = min{D(i-1)(y) +1 | y < x} U { D(i-1)(y) | y<x, y is original value}  U {INFINITY}
orig = [2,1,3,4] 
vals = [[1,2],[1,2],[3,4],[3,4]]
D = [[1,1]]
for x in range(len(vals[0])):
    if vals[0][x] == orig[0]:
        D[0][x] = 0
    else: 
        vals[0][x] = 1
for i in range(1,len(orig)):
    D.append([max_int32, max_int32])
print D
for i in range(1,len(orig)):
    for x in range(len(vals[i])):
        for y in range(len(vals[i-1])):
            if vals[i-1][y] < vals[i][x] and vals[i][x] != orig[i]:

                D[i][x] = min(D[i][x],D[i-1][y] + 1)
            elif vals[i-1][y] < vals[i][x]:
                D[i][x] = min(D[i][x],D[i-1][y])
print min(D[len(orig)-1])   
orig = [3,4,1,2] 
vals = [[3,4],[3,4],[1,2],[1,2]]