题解:P16651 [GKS 2018 #E] Milk Tea
chenshanlai · · 题解
题解:P16651 [GKS 2018 #E] Milk Tea
题意
每一杯奶茶都有
Shakti 带着他的
对于题目来源、题目背景、原题目描述及题目描述解释、输入输出格式、样例、样例解释和数据范围,请返回 Problem。
思路
如果不知道下列用到的算法且目前会因此影响阅读,建议先查对应资料。
0x00 方法:暴力
做法:
暴力枚举每一种统一发放奶茶的配方,得到最优解。
是否能过:
时间复杂度
O(T\times (N+M\times P)\times 2^{P}) 。0x01 方法:动态规划
做法: :::success[分析] 首先,可以发现如果店里每一种配方都做,那么每一种配料选不选取决于哪一种选择的偏爱较多。
但是店里有
M 种配方不制作,那么很明显发现只要求出抱怨次数最少的前M+1 优解,那么就一定有能制作的配方。 ::: 首先建立二维数组dp 和二维字符串数组sdp ,其中dp_{i,j} 和sdp_{i,j} 分别代表在选择i 中配料是否添加后(暂不考虑店里不制作的情况)最少抱怨次数的第j 优解的抱怨次数的选择序列,如果一共没有j 种组合,那么只要分别设为+\infty 和空即可。再将
dp_{0},sdp_{0} 根据实际情况赋值,也就是dp_{0,1},sdp_{0,1} 分别赋值为0 和空,否则分别赋值为+\infty 和空,并建立数组ci ,ci_{i,j} 代表第i 中配料的第j 种选择(从0 开始)。接下来枚举每一个
i (1\le i\le P )。首先,建立两个指针
a 和b (下标),初始指向dp_{i-1} 的第一个位置。然后,分别求出
dp_{i-1,a} + ci_{i,1} (在不选这种配料时的剩余最优解的抱怨次数)和dp_{i-1,b} + ci_{i,0} (在选这种配料时的剩余最优解的抱怨次数)的较小值放进dp_{i,a+b-1} ,并且根据选择的实际情况计算sdp_{i,a+b-1} 的选择字符串。最后,找出没有在不制作的组合中的选择最优解,可以从最优解一个一个枚举来实现。
是否能过:
时间复杂度
O(T\times(N\times P + P^2\times M)) 。其他
:::success[AC 记录] 我的 AC 记录。 ::: :::info[注明]
- 本题解所有题目中有的变量均与题目相同。
- 题解中的
dp 和sdp 在 AC 记录中用的是结构体。- 本题解下标从
1 开始。 :::