解题思路
本题求最长连续有效子数组,规则可归纳为三类局部约束:
- 子链必须以
0 开头;
1 的前一项必须是 0;2 的前两项必须是 0,0;
- 相邻两个
0 之间至多一个非 0 元素(等价于不能出现 0,1,1,0 或 0,1,2,0 等「两连扩展/高级夹在两个基础之间」)。
动态规划(三状态):扫描到下标 i 时,维护以 i 结尾的最长合法链长度:
P14386.Skill执行链完整性检测(100分)
题目内容
在 AI 助手的技能系统中,执行链由多个 Skill 按顺序排列。每个 Skill 有一个类型标记:
- type[i]=0: 基础类型 Skill,无依赖,可以独立执行
- type[i]=1: 扩展类型 Skill,依赖前一个 Skill 执行
- type[i]=2: 高级类型 Skill,依赖前两个 Skill 执行
执行链的完整性规则:
1. 首元素限制:执行链不能以扩展类型(type=1)或高级类型(type=2)开头,必须以基础类型(type=0)开头
2. 依赖传递:
- 扩展类型(type=1)的直接前驱必须是基础类型(type=0)
- 高级类型(type=2)的前驱和前前驱都必须是基础类型(type=0)
3. 链式依赖:每两个相邻的基础类型之间最多允许存在一个扩展类型或高级类型
给定一个类型数组 type,找到最长的连续 Skill 子链,使得子链满足完整性规则。返回该子链的长度。
数据规模
- 0 ≤ type.length ≤ 2000
样例1
输入
[0,0,0]
输出
3
说明
全为基础类型,满足规则(不违反任何约束)
样例2
输入
[0,1,0,1]
输出
4
说明
0→1✓ (基础后接扩展)
1→0✓(扩展后接基础)
0→1✓(基础后接扩展)
无违反规则,整个链有效
样例3
输入
[2,0,0]
输出
2
说明
首元素高级类型违规,从位置 1 开始 [0,0] 长度 2
样例4
输入
[0,1,0,0,2]
输出
5
说明
0→1✓(基础后接扩展)
1→0✓(扩展后接基础)
0→0✓ (基础后接基础)
0→0→2✓ (基础、基础后接高级)