最长递增子序列变化动态规划

时间:2020-05-27 15:58:59

标签: algorithm dynamic-programming lis

我有这个问题:

给出以下内容:

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的数字一个。

如果数字Nred,则我们只能向左移动(移动任意数字)到比当前数字大>=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]= 9A[4] = 8A[5] = 9A[9] =12

递归为OPT[i] = max{1, 1+ OPT[j]},其中j是下一个可能的移动。

我使用动态编程走对了吗?运行时是O(n²)吗?

0 个答案:

没有答案