【语法】
一、隐蔽陷阱:最长递增子序列用平方级动态规划逐对比较;贪心加二分维护"每个长度对应的最小结尾",一遍扫描加对数查找完成。
二、底层原理:tails 表存"长度为 i 的递增子序列的最小结尾":新元素二分找到应替换的位置替换之,tails 长度即答案;替换保持 tails 单调,为后续元素留最大空间。
三、正确代码:
错误写法。示例代码如下:
local function lis(t)
local n = #t
local dp = {}
local best = 0
for i = 1, n do
dp[i] = 1
for j = 1, i - 1 do
if t[j] < t[i] then
dp[i] = math.max(dp[i], dp[j] + 1) -- 平方级
end
end
best = math.max(best, dp[i])
end
return best
end
正确写法。示例代码如下:
local function lis(t)
local tails = {}
for _, v in ipairs(t) do
local lo, hi = 1, #tails
while lo <= hi do
local mid = math.floor((lo + hi) / 2)
if tails[mid] < v then lo = mid + 1
else hi = mid - 1 end
end
tails[lo] = v -- 二分定位替换
end
return #tails
end
sendmsg(actor, 1, "最长递增子序列长度 "
.. lis({3, 1, 2, 1, 8, 5, 6}))
四、引擎验证:1 万乱序数值:平方版 5000 万次比较;贪心加二分版约 13 万次,快 380 倍,长度一致。
五、FAQ:问:tails 是子序列本身吗?答:不是,长度才是答案,内容仅为优化服务的中间态。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏】 一、规则机制 一行定骨架:mask:setVisible(true) 先于一切加载动作。切图最怕"加载一半的半成品…
【游戏】 一、规则机制 线上事故:网络一抖直接踢回登录页,重新登录还要排队,火气全从这一脚踢出来。断线重连改温和路线:检测到…
【语法】 一、机制原理 抛个坑:界面配置十来个字段,只想改颜色一项,传入的覆盖表却把没写的字段全顶成 nil——直接拿覆盖表…
【游戏】 一、规则机制 一行定骨架:first = math.floor(offset / ROW_H)。千行列表建一千个节…
【语法】 一、机制原理 隐蔽的坑:给敏感词表去重,用了"排序后相邻比对"的老办法,重复是去掉了,原有优先级顺序也被打乱。去重…
【语法】 一、机制原理 隐蔽的坑:网格数据用 grid[x .. "_" .. y] 拼字符串键存取,写入顺手,可要遍历整张…