zoukankan      html  css  js  c++  java
  • 模拟35 题解

    A. 公园

    长度放不进状态,那就把遍历的点的个数放进状态,使长度最小。

    然后就变成了DAG上最短路问题。

    设个源点汇点,直接拓扑排序就完了。

    B. 计划

    设$mn(i)$表示左端点选i,最小的愉快的旅行。

    显然$mn(i)$是单调的,单调指针扫过去就完了。

    然后对询问枚举左端点等差数列求和,就做到了$O(qn)$。

    将n个点分成$sqrt n$个块,处理出每个块到每个点的答案,这个可以递推。

    大块直接走分块,小的部分暴力,复杂度就变成了$O(nsqrt n)$

    C. 抽卡

    考试时打的状压,将每个点拆为了3个点,结果3个点的位置放错了。

    我将3个点的位置设为了i-1,2*(i-1),3*(i-1),显然是错的,应设为i-1,n+i-1,n+n+i-1。

    正解也一定是状压,但拆为3个点是冗余的,我们只关心已有了几个颜色。

    并且,正解将已经抽了几次卡设进了状态,

    也就不用预处理每次氪金的概率数组,两层枚举状态。

    设$dp(st,i)$表示当前状态用四进制表示为st,这次氪金已经抽了i次卡。

    每次考虑单次抽卡比较简单,如果已经有了抽到的卡,考虑一下转移到自己的下一步 和 转移到其它状态的概率就可以了。

    如果这次氪金已经抽完卡,$dp(st,m)=dp(st,0)+1$。

    然而难点在于:

    每次都转移到自己的下一步,这个转移会出环。

    高斯消元是可行的,但是复杂度$O(4^n*m^3)$,过不去。

    然而本题的环比较简单,一定只有一个包含所有变量的大环。

    直接手动模拟高斯消元就可以了。

    也就是说,设$dp(st,i)=a_i*dp(st,m)+b_i$。

    $dp(st,i)=c_i*dp(st,i+1)+d_i$,

    则有$dp(st,i)=c_i*a_{i+1}*dp(st,m)+d_i+c_i*b_{i+1}$,

    所以a,b数组是可以递推的。

    最终得到$dp(st,0)=a_0*dp(st,m)+b_0$

    且$dp(st,m)=dp(st,0)+1$

    联立解得$dp(st,m)$,回代就完了。

  • 相关阅读:
    工作中简单又实用的vim配置
    宏定义的专业写法(工作中常用)
    17八皇后问题
    04文件与IO
    响应式布局编码
    静态布局,自适应布局,流体式布局,响应式布局概念
    CSS:<link>标签rel和media的解释
    我想去的公司的入职要求
    JS:引用类型,基本类型
    Android Launcher 详解
  • 原文地址:https://www.cnblogs.com/skyh/p/11452007.html
Copyright © 2011-2022 走看看