考虑条件主要食材最大的不超过总菜数的一半,不好处理,但存在主要食材最大的超过总菜数的一半是好处理的,容斥即可。
首先计算所有情况,由于题目要求每个烹饪方式最多使用一次,很明显可以记 \(g_i\) 表示前 \(i\) 种烹饪方式的方案数。
\[g_i = g_{i-1}+g_{i-1} \times \sum_{j=1}^{m}a_{i,j} \]预处理 \(sum_i = \sum_{j=1}^{m} a_{i,j}\),计算 \(g_n\) 是 \(O(n)\) 的,得到 \(g_n-1\) 即为所有情况。
接下来考虑不合法的情况,首先钦定食材 \(x\) 超过一半,即食材 \(x\) 用的次数比其他菜的数量加起来都多。
显然记 \(f_{i,j,k}\) 表示前 \(i\) 种烹饪方式,食材 \(x\) 做了 \(j\) 道菜,其他食材做了 \(k\) 道菜,转移有三种情况。
- 不选这种烹饪方式,\(f_{i-1,j,k}\)。
- 用这种烹饪方式做食材 \(x\),\(f_{i-1,j-1,k} \times a_{i,x}\)。
- 用这种烹饪方式做其他食材,\(f_{i-1,j,k-1} \times \sum_{l=1}^{m(l \ne x)}a_{i,l}\)。
转移即为:
\[f_{i,j,k}=f_{i-1,j,k}+f_{i-1,j-1,k} \times a_{i,x}+f_{i-1,j,k-1} \times (sum_i-a_{i,x}) \]不合法的情况为
\[\sum_{j>k} f_{n,j,k} \]这样计算,状态是 \(O(n^3)\) 的,转移是 \(O(1)\) 的,枚举 \(x\) 是 \(O(m)\),总时间复杂度为 \(O(n^3m)\)。
考虑优化状态,最后只用统计 \(j>k\),因此只需要记录 \(j-k\) 即可,这样状态变成了 \(f_{i,j}\)。
转移只需要改一点:
\[f_{i,j}=f_{i-1,j}+f_{i-1,j-1} \times a_{i,x}+f_{i-1,j+1} \times (sum_i-a_{i,x}) \]总时间复杂度 \(O(n^2m)\)。
标签:烹饪,方式,题解,sum,times,今天,Emiya,食材 From: https://www.cnblogs.com/xcs123/p/17884022.html