Emiya 家今天的饭
看这篇题解
能学到挺多东西的。
首先是容斥原理,我们看到了序列题不超过一半,可以往这上面想,因为一定不会有两种元素同时超过一半
然后就是DP,我们在这种情况下的DP一般都是预处理,但是这道题目是每次都要枚举不合法的列\(col\)进行DP,所以思维不要被限制了
最后是DP的优化。这是我第一次见到通过观察最后的求式来优化DP的。观察最后的和式,我们发现我们只关心\(j>k\)的情况,所以可以将维度压缩成一维
或者这篇题解也可以看一看
然后说一个错误的思路,计算不合法方案数的时候,设\(g[i][j][k]\)表示前\(i\)行第\(j\)列占了\(k\)行的方案数,然后有\(g[i][j][k]=g[i-1][j][k]+a_{i,j}\times g[i-1][j][k-1]+(sum_i-a_{i,j})\times g[i-1][j][k]\);这样的话是会把合法的方案统计进去的,必须要增加一维描述其他非\(j\)列的菜的数量才能比出相对大小
update 2024.8.10
其实这里可以这么想:设第\(i\)种菜肴做了\(x_i\)道菜,于是有\(\overset{m}{\underset{i=1}{\sum}}x_i=k\),要求\(\forall i∈[1,m],x_i≤\lfloor\frac{k}{2}\rfloor\),这就是典型的容斥原理的形式了
然后那个DP的优化一定要记住,我们要么从状态上优化,要么从转移过程优化,要么利用等效状态,这里就从状态上优化,只不过是通过观察求式来优化状态的