求最长公共子序列,golong语言

给出两个长度为 n 的整数序列,求它们的最长公共子序列(LCS)的长度,保证第一个序列中所有元素都不重复。
注意:
第一个序列中的所有元素均不重复。
第二个序列中可能有重复元素。
一个序列中的某些元素可能不在另一个序列中出现。
输入格式
第一行包含一个整数 n。

接下来两行,每行包含 n 个整数,表示一个整数序列。

输出格式
输出一个整数,表示最长公共子序列的长度。

数据范围
1≤n≤106,
序列内元素取值范围 [1,106]。
样例
输入样例1:
5
1 2 3 4 5
1 2 3 4 5
输出样例1:
5
输入样例2:
5
1 2 3 5 4
1 2 3 4 5
输出样例2:
4

package main
import  "fmt"
const N=1000110
var(
     id[N]int
     q[N]int 
)
func max(a,b int)int{
    if a > b{
        return a
    }
    return b
}
func main(){
    var n,len,x int
    fmt.Scanf("%d",&n)
    for i:= 0; i < 1000110; i ++ {
        id[i] = -1
    } 
    for i:= 0; i < n; i ++ {
        fmt.Scanf("%d",&x)
        id[x] = i
    }
    len = 0
    q[0] = -1
    for i:= 0; i < n; i ++{
        var x,k,l,r int 
        fmt.Scanf("%d",&x)
        k = id[x]
        if k==-1{
            continue
        }
        l=0
        r=len
        for {
            if l<r{
                var mid int
                mid=(l+r+1)>>1
                if q[mid]<k{
                    l=mid
                }else {
                    r=mid-1
                }
            }else {
                break;
            }
        }
        q[r+1]=k
        len=max(len,r+1)
    } 
    fmt.Println(len)
}
运行结果:TLE(超时,数据大)
我的思路:公共子序列因为不用求具体的序列是多少,我们转化为求公共子序列的下标,因为下标是递增的!
数据达到10000以上时,可不可以AC呢?

我们可以把LCS问题转化成LIS问题,即求tar数组的最长上升子序列问题。
可以参考下这个思路,希望对你有帮助: