题目要求修改初始状态序列 a 中最少的工位,使得修改后的序列满足关系序列 b 的所有相邻约束。由于每个工位只有 0 或 1 两种状态,并且约束只涉及相邻两个工位的关系,可以采用动态规划求解。
状态定义
令 dp[i][0] 表示考虑前 i 个工位,且第 i 个工位的状态最终为 0 时,所需的最少操作次数。
令 dp[i][1] 表示考虑前 i 个工位,且第 i 个工位的状态最终为 1 时,所需的最少操作次数。
初始化(第 1 个工位)
在某个自动化流水线上,工件依次经过 n 个检测工位,每个工位会记录一个二进制状态(0 或 1),形成长度为 n 的状态序列 a。质量规范给出一个长度为 n−1 的关系序列 b,其中 bi=1 要求相邻工位状态不同,即 aieqai+1;bi=0 要求相邻工位状态相同,即 ai=ai+1。初始序列 a 可能不满足规范,每次操作可以选择一个工位并翻转其状态(0 变为 1,1 变为 0)。问最少执行多少次操作,才能使所有相邻关系都得到满足。
约束:测试用例的数量 T 满足 1≤T≤100。对于每组数据,状态序列长度 n 满足 2≤n≤106,且单个输入文件内所有 n 的总和不超过 106。
第一行输入一个整数 T,表示测试数据组数。接下来每组数据包含三行:第一行一个整数 n,表示序列长度;第二行一个长度为 n 的字符串,由字符 0 和 1 组成,表示初始状态序列 a;第三行一个长度为 n−1 的字符串,由字符 0 和 1 组成,表示关系序列 b。
By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.