Emiya今天的饭 题解

题目

考虑条件主要食材最大的不超过总菜数的一半,不好处理,但存在主要食材最大的超过总菜数的一半是好处理的,容斥即可。

首先计算所有情况,由于题目要求每个烹饪方式最多使用一次,很明显可以记 \(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)\)

posted @ 2023-12-07 21:28  小超手123  阅读(4)  评论(0编辑  收藏  举报