zoukankan      html  css  js  c++  java
  • CF1110D Jongmah(DP)

    题目链接:CF原网  洛谷

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

    $1le n,mle 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$ 会被用到第二种二元组中。

    那么就可以知道,$0le j,kle 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%……不好意思放了……

  • 相关阅读:
    TestNG超时测试
    iOS平台如何进行app自动化测试?
    软件性能测试见解与总结
    性能测试关注点整理总结
    测试用例的设计步骤
    如何建立软件测试管理体系?
    关于手工测试,应该如何做?
    web性能测试流程
    SPASVO推出ALM(覆盖全生命周期的研发过程管理平台)免费在线体验平台
    如何使用testcenter统计开发工程师工作质量?
  • 原文地址:https://www.cnblogs.com/1000Suns/p/10357582.html
Copyright © 2011-2022 走看看