模型选择
数据规模:,所有测试用例的 之和不超过 ,,。
思路
设 表示以模型 结尾(必选 )时最多能选出的模型数。 初值 (只选它自己);转移时枚举 的真约数 ,若 ,模型 就可以接在 后面(编号满足 的倍数关系,尺寸严格更大),于是 。答案即为所有 的最大值。
实现上按 从小到大枚举,反过来用 去刷新它的所有倍数 。 由于 的真约数都小于 ,外层循环走到 时 已经定值,可以直接拿来转移,无需刻意约数分解。每个 要访问约 个倍数,总访问次数是调和级数 , 时不过约 次。
复杂度
时间 (调和级数),额外空间 。
仓颉实现
查看仓颉实现
import std.env.*
import std.convert.*
func solve(reader: ConsoleReader): Unit {
let n = Int64.parse(reader.readln().getOrThrow())
let s = reader.readln().getOrThrow().split(" ", removeEmpty: true).map({ p: String => Int64.parse(p) })
let dp = Array<Int64>(n + 1, { _ => 1 })
var ans: Int64 = 1
var j: Int64 = 1
while (j <= n) {
if (dp[j] > ans) {
ans = dp[j]
}
var m = j + j
while (m <= n) {
if (s[m - 1] > s[j - 1] && dp[j] + 1 > dp[m]) {
dp[m] = dp[j] + 1
}
m += j
}
j += 1
}
println(ans)
}
main() {
let reader = getStdIn()
let t = Int64.parse(reader.readln().getOrThrow())
var k: Int64 = 0
while (k < t) {
solve(reader)
k += 1
}
}