我有这个问题:
鉴于以下情况:
A = [9,6,9,3,8,9,2,0,4,12]
C = [r,g,r,g,r,g,r,r,r,g]
其中 - r
= 红色 - g
= 绿色
该列表表示数组中同一索引中数字的颜色,A
即A[0] = 9 = red, A[1] = 6 = green, ...
我们需要选择一个数字N
开始,如果该数字是green
我们只能向右移动(任意数字)到一个>=N
大于当前数字的数字。
如果数字N
是red
,我们只能向左移动(任意数字)到>=N
大于当前数字的数字。
目标:找到可能的最长移动序列,返回路径的索引。如果有多个相同长度且最长的子序列,则返回任何人:
示例 1:
A = [9,6,9,3,8,9,2,0,4,12]
C = [r,g,r,g,r,g,r,r,r,g]
output: [7,6,3,8,1,4,0]
示例 2:
A = [1,2,3,4,5,6,7,10]
C =[r,r,r,r,r,r,r,r]
output:[7]
示例 3:
A = [5,3,2,0,24,9,20]
C = [g,g,g,g,r,r,g]
output: [0,5,4]
我的算法的当前想法:
考虑 中每个元素的可能移动A
,对于第一个示例A[0] = 9
= red
。
由于没有左元素,因此只有1
移动(选择A[0]
)。
所以,OPT[0] = 1
。对于A[1] = 6
= green
。可能的移动是:A[2]= 9
, A[4] = 8
, A[5] = 9
, A[9] =12
。
递归是OPT[i] = max{1, 1+ OPT[j]}
下j
一个可能的举动。
我是否在使用动态编程的正确轨道上?运行时O(n²)
不是吗?