| // Copyright 2022 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| package lcs | |
| import ( | |
| "fmt" | |
| ) | |
| // For each D, vec[D] has length D+1, | |
| // and the label for (D, k) is stored in vec[D][(D+k)/2]. | |
| type label struct { | |
| vec [][]int | |
| } | |
| // Temporary checking DO NOT COMMIT true TO PRODUCTION CODE | |
| const debug = false | |
| // debugging. check that the (d,k) pair is valid | |
| // (that is, -d<=k<=d and d+k even) | |
| func checkDK(D, k int) { | |
| if k >= -D && k <= D && (D+k)%2 == 0 { | |
| return | |
| } | |
| panic(fmt.Sprintf("out of range, d=%d,k=%d", D, k)) | |
| } | |
| func (t *label) set(D, k, x int) { | |
| if debug { | |
| checkDK(D, k) | |
| } | |
| for len(t.vec) <= D { | |
| t.vec = append(t.vec, nil) | |
| } | |
| if t.vec[D] == nil { | |
| t.vec[D] = make([]int, D+1) | |
| } | |
| t.vec[D][(D+k)/2] = x // known that D+k is even | |
| } | |
| func (t *label) get(d, k int) int { | |
| if debug { | |
| checkDK(d, k) | |
| } | |
| return int(t.vec[d][(d+k)/2]) | |
| } | |
| func newtriang(limit int) label { | |
| if limit < 100 { | |
| // Preallocate if limit is not large. | |
| return label{vec: make([][]int, limit)} | |
| } | |
| return label{} | |
| } |