想了两个小时脑子都晕,结果发现自己做法假了,所以求助这题的正确做法。
先说一下我的假做法:
为了表述方便,下面的大写 K 代表题面中小写 k 的含义。
首先 DP 预处理出点集的所有大小为 i 的子集的最大团大小之和为 F(i)。
然后我们对于每一种情况计算贡献。即答案为:在第 k 回合结束后,剩下 s 个点没被删的方案数乘上 F(s)。所以我们先要求出这个「方案数」。
考虑组合意义,我们要求的是:「长度为 K,第 k 位为 s,且每一位都在 [1,n] 之间的不增序列」计数。考虑组合意义,在一个网格图上从 (1,1) 走到 (k,n),每一步都是向右或者向下,且规定某个竖线必须走,则一条折线会对 K 条竖线产生贡献。即方案数为 K(KK+s)=K(sK+s)。从 1 到 n 枚举 s,则答案为:
s=1∑nF(s)K(sK+s)
然后我打完代码才发现这个思路有个问题,就是我的 F(i) 代表的是「所有」大小为 i 的子集的最大团大小之和。但是你每次计算的时候,应该乘的是「一种」大小为 i 的子集的最大团大小。所以导致答案错误。而且我感觉我的思路从头到尾全错了。
我已经想了俩小时了,现在脑子想晕了且一点进展都没有,我想知道这题应该咋计算每种方案的贡献,而且题解区和网上都没有搜到关于这题的题解。求助。