1 条题解
-
0
问题分析
题目要求在满足每个同学容忍度的前提下,计算食堂做完所有菜的最少时间。关键约束是:第i个同学最多允许紧跟其后的B_i个人先拿到饭菜。做菜时间与前一道菜的口味相关,计算公式为(a or b) - (a and b),该式等价于a异或b(a ^ b)。
动态规划设计
状态定义
使用三维状态
f[i][s][last]表示当前处理状态:i:表示当前需要考虑的第i个同学(按原始排队顺序)s:二进制状态压缩,表示在第i个同学之前,其身后哪些同学已被提前处理(利用B_i≤7的特性,用8位二进制即可表示)last:上一个处理的同学的口味值
状态值为达到该状态所需的最小总时间。
状态转移
-
提前处理后续同学:对于第i个同学,可选择处理其身后的j(1≤j≤B_i)个同学中尚未处理的同学。更新状态时,将对应位置的二进制位设为1,表示该同学已被处理。
-
处理当前同学:当决定处理第i个同学时,计算从上个状态转移过来的时间(加上与上一个处理的同学口味的异或值),并更新新状态。此时需要确定下一个要考虑的同学位置j,并调整状态掩码。
边界条件
初始状态为
f[1][0][*] = 0,表示考虑第1个同学,尚未提前处理任何同学,初始时间为0(第一个菜不需要时间)。最终答案
最终答案为
f[n+1][0][*]中的最小值,表示所有同学都已处理完毕,且状态掩码为0的最小总时间。复杂度分析
- 时间复杂度:由于N≤1000,B_i≤7(状态掩码为2^7=128种),口味值≤1000,整体复杂度约为O(N×2^7×1000×7),在可接受范围内。
- 空间复杂度:使用哈希表存储状态,避免了对所有可能口味值的空间预分配,有效降低了空间消耗。
该解法通过状态压缩和动态规划,高效地在满足约束条件的前提下找到了最优解。
算法标签
- 动态规划(DP)
- 状态压缩
- 1
信息
- ID
- 4961
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者