我有这个问题:
给出以下内容:
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²)
吗?