给定一个长度为 n 的 01 串 s 。一次切割操作如下: 选择一个长度 ≥ 2 的子串,将其分成两个非空连续子串 a (左)和 b (右); 记 a 中字符 0 的出现次数为 C_0 , b 中字符 1 的出现次数为 C_1 ; 仅当 L≤ |C_0-C_1|≤ R 时,此次切割被视为合法。 每次合法切割产生的两个子串都可以继续被独立切割(若长度 ≥ 2 且满足切割条件)。问在最优策略下,最多可以执行多少次切割?
第一行输入三个整数 n,L,R(1≤ n≤500,0≤ L≤ R≤500) ——字符串长度与参数限制。 第二行输入一个长度为 n 的 01 串 s 。
输出一个整数,表示最多能执行的切割次数。
6 2 3 011011
3
考点:动态规划
数据规模 n ≤ 500 | 限制 1 秒 / 256MB | 标准输入输出
推荐方向:动态规划
本题切入点
对 01 串不断二分子串求最大切割次数,天然是区间 DP:dp[l][r] = 子串 [l,r] 的最大切割次数,枚举满足 L ≤ |C0−C1| ≤ R 的切点 k,转移为 dp[l][k] + dp[k+1][r] + 1;n≤500 时 O(n³) 可行。
把问题拆成子问题,用状态表示「已处理到哪儿」,靠转移方程递推。
思路框架(动态规划 通法 · 非本题专属)
实现要点:一般是「先枚举阶段,再枚举状态,最后枚举决策」三层循环;空间大时可滚动数组优化。
复杂度:时间 O(状态数 × 转移代价) | 空间 O(状态数)
该范式的通法易错点
对照本题
样例 1:输入 6 2 3 / 011011 → 输出 3
其中一种切割次数最多的切法如下:
第一次切割可以切: 0|11011 ,然后选择 11011 这个串继续做切割。
第二次切割可以切: 1|1011 ,然后选择 1011 这个串继续做切割。
第三次切割可以切: 1|011 。
解析由校招宝本地引擎整理(依据源站考点标签 / 人工判题标注 / 题面规模信号),非官方题解,仅供思路参考。
本题来源:华为机试编程模拟题7。