CF1110D Jongmah(DP)

题目链接:CF原网  洛谷

题目大意:有 $n$ 个数,每个都不超过 $m$。一个三元组 $(a,b,c)$ 是合法的当且仅当 $a=b=c$ 或者 $a+1=b=c-1$。每个数只能用一次。问最多能凑出一个合法三元组。

$1\le n,m\le 10^6$。


首先我们发现对于一个 $x$,$(x,x+1,x+2)$ 不会出现超过 $2$ 次。因为 $3$ 个或以上的 $(x,x+1,x+2)$ 也可以被拆分成 $(x,x,x),(x+1,x+1,x+1),(x+2,x+2,x+2)$ 这几个三元组,而总个数不变。

那么就可以DP了。(smg???)

首先对序列开桶,设有 $cnt_i$ 个数是 $i$。

设 $dp_{i,j,k}$ 表示现在只考虑 $\le i$ 的数。其中我们规定以后还有 $j$ 个 $i$ 会被用到第二种二元组中,还有 $k$ 个 $i-1$ 会被用到第二种二元组中。

那么就可以知道,$0\le j,k\le 4$(具体原因下面会讲),$j$ 不能超过 $cnt_i$,$k$ 不能超过 $cnt_{i-1}$。

初始状态:$dp_{1,j,0}=(cnt_1-j)/3$。因为有 $j$ 个不能用到第一种三元组。

转移:$dp_{i,j,k}=\max(dp_{i-1,k+l,l}+l+(cnt_i-j-l)/3)$。

具体解释一下,我们枚举用多少个 $i-2$ 配成多少个 $(i-2,i-1,i)$(就是 $l$)。

$i-2$ 再怎么样,前面规定要用的也得用完了,所以转移前的状态第三维是 $l$。

转移后还有 $k$ 个 $i-1$ 要被用到第二种三元组,说明转移前规定了 $k+l$ 个。所以转移前的状态第二维是 $k+l$。

(这也解释了为什么要开到 $4$)

那么有 $l$ 个 $i$ 已经被用到第二种三元组,而有 $j$ 个 $i$ 被规定不能用到第一种三元组,所以至多可以多出 $(cnt_i-l-j)/3$ 个第一种三元组。

答案就是 $dp_{m,0,0}$。规定了以后要用的状态是无效的。

代码的话……由于我基本看着PBdalao的代码写的,所以相似度高达99%……不好意思放了……

猜你喜欢

转载自www.cnblogs.com/1000Suns/p/10357582.html