zoukankan      html  css  js  c++  java
  • 赛艇 题解

    一颗赛艇

    https://www.lydsy.com/JudgeOnline/problem.php?id=4584

    虽然名字听起来很暴力(+1s),却是组合计数好题,在考试时都没有看出来是组合计数。

    对于子任务1/2

    区间的总长度不超过1e6,可以将区间内的每个数离散化到一个区间里。

    于是可以写出一个简单的dp,

    dp(i,j)表示到第i个学校,最多派出划艇数量为j的方案数,

    简单的转移。

    使用数状数组或线段树优化一下就可以做到O(NlogN),

    最后将答案-1,删去一个划艇都没有的方案即可。

    正解

    n很小,可以将n个区间的端点离散化,

    得到最多2*n个端点。

    改变dp的状态定义,

    设dp(i,j)表示到第i个学校,最多派出划艇数量在离散化后(j-1,j)区间内的方案数。

    不在同一区间内的方案,可以参照子任务1/2,直接进行转移,

    对于在同一区间内的方案,则用到了组合数。

    将问题抽象化,则为在连续k个空格上,每个空格选择(1,len)之中的一个数放入,或者不选择任何一个数,要求严格递增,求总方案数。

    不妨先考虑一个简单的问题:

    不能不选择数,求总方案数。

    显然答案是C(len,k),因为对于每种组合,和问题的答案是一一对应的。

    推广到可以不选数的情况,

    我们可以在k个空格外,增加k个0,第i个0表示第i个空格不选数,

    我们发现,C(len+k,k)恰好与我们所求的问题一一对应,于是我们用构造的方法得到了问题的解,

    使用前缀和等优化一下转移即可。

  • 相关阅读:
    【数论】错排问题
    【数论】求逆元的几种方式
    【数论】卢卡斯定理模板 洛谷P3807
    【单调队列优化dp】 分组
    【期望dp】绵羊跳弹簧
    软件工程总结
    结对项目-地铁出行路线规划程序(续)
    个人作业--week3
    个人作业-week2
    个人作业-week1
  • 原文地址:https://www.cnblogs.com/skyh/p/11191730.html
Copyright © 2011-2022 走看看