自学内容网 自学内容网

Day48【NOIP模拟赛13】

序列

很好的一道 “送命题” “签到题”,想了两个小时一分没有,破防了。

考场上想到了定义 d p i , j , 0 / 1 dp_{i,j,0/1} dpi,j,0/1 表示处理完前 i i i 个数,当前数为 j j j,是否被修改的方案数,然而不会去重,遂开摆。

所以为了 不重不漏 的统计方案数,我们增加一种状态 d p i , j , 2 dp_{i,j,2} dpi,j,2 表示当前位既有可能被修改,又有可能未被修改的方案数,请注意这种状态与其它两种状态并不存在所谓的包含关系,一定的情况就只能属于 0 , 1 0,1 0,1,可能的情况就只能属于 2 2 2

当然为了方便些,下文中 d p i , j , 0 / 1 / 2 dp_{i,j,0/1/2} dpi,j,0/1/2,分别表示表示处理完前 i i i 个数,当前位为 j j j,未被修改( 0 0 0),都有可能( 1 1 1),一定被修改( 2 2 2)的方案数。

现在考虑转移:

  • m m m 后面可以接任意数, 1 1 1 可以接在任意数后面。
  • 如果上一位是一个被修改的不为 m m m 的数,当前位一定被修改。
  • 如果上一位未被修改,那么这一位要么不被修改,要么被修改为 1 1 1
  • 如果上一位被修改成了不是 m m m 的数 x x x,当前位要么为 1 1 1,要么为 x + 1 x + 1 x+1
  • 如果当前位为 0 0 0,上一位要么未被修改,要么被修改为了 m m m

把文字语言转化成状态转移方程式可得:

  • d p i , a i , 0 ← d p i , a i , 0 + d p i − 1 , j , 0 , j ∈ [ 0 , m ] dp_{i,a_i,0} \leftarrow dp_{i,a_i,0}+dp_{i-1,j,0},j\in[0,m] dpi,ai,0dpi,ai,0+dpi1,j,0,j[0,m]
  • d p i , 1 , 1 + ( a i ≠ 1 ) ← d p i , 1 , 1 + ( a i ≠ 1 ) + d p i − 1 , j , 0 , j ∈ [ 0 , m ] dp_{i,1,1+(a_i \ne 1)} \leftarrow dp_{i,1,1+(a_i \ne 1)}+dp_{i-1,j,0},j\in [0,m] dpi,1,1+(ai=1)dpi,1,1+(ai=1)+dpi1,j,0j[0,m]
  • d p i , 1 , 2 ← d p i , 1 , 2 + d p i − 1 , j , 2 , j ∈ [ 0 , m − 1 ] dp_{i,1,2} \leftarrow dp_{i,1,2}+dp_{i-1,j,2}, j\in[0,m-1] dpi,1,2dpi,1,2+dpi1,j,2,j[0,m1]
  • d p i , j , 1 + ( a i ≠ j ) ← d p i , j , 1 + ( a i ≠ j ) + d p i − 1 , m , 1 + d p i − 1 , m , 2 , j ∈ [ 2 , m ] dp_{i,j,1+(a_i \ne j)} \leftarrow dp_{i,j,1+(a_i \ne j)}+dp_{i-1,m,1}+dp_{i-1,m,2}, j\in[2,m] dpi,j,1+(ai=j)dpi,j,1+(ai=j)+dpi1,m,1+dpi1,m,2,j[2,m]
  • d p i , j + 1 , 2 ← d p i , j + 1 , 2 + d p i − 1 , j , 2 , j ∈ [ 0 , m − 1 ] dp_{i,j+1,2} \leftarrow dp_{i,j+1,2}+dp_{i-1,j,2}, j \in [0,m-1] dpi,j+1,2dpi,j+1,2+dpi1,j,2,j[0,m1]
  • d p i , j + 1 , 1 + ( a i ≠ j + 1 ) ← d p i , j + 1 , 1 + ( a i ≠ j + 1 ) + d p i − 1 , j , 1 , j ∈ [ 0 , m − 1 ] dp_{i,j+1,1+(a_i \ne j+1)} \leftarrow dp_{i,j+1,1+(a_i \ne j+1)}+dp_{i-1,j,1}, j \in [0,m-1] dpi,j+1,1+(ai=j+1)dpi,j+1,1+(ai=j+1)+dpi1,j,1,j[0,m1]
  • 由于 d p i − 1 , m , 0 dp_{i-1,m,0} dpi1,m,0 d p i − 1 , m , 2 dp_{i-1,m,2} dpi1,m,2 都没有后效性,即不会影响 [ i , n ] [i,n] [i,n] 这段数,所以转移前让 d p i − 1 , m , 0 ← d p i − 1 , m , 0 + d p i − 1 , m , 2 dp_{i-1,m,0} \leftarrow dp_{i-1,m,0} + dp_{i-1,m,2} dpi1,m,0dpi1,m,0+dpi1,m,2 没有什么实际意义,单纯方便一点。

初始状态显然有: d p 1 , a 1 , 0 = d p 1 , 1 , ( 1 + a 1 ≠ 1 ) = 1 dp_{1,a_1,0}=dp_{1,1,(1+a_1 \ne 1)}=1 dp1,a1,0=dp1,1,(1+a1=1)=1
答案显然是 d p n , a n , 0 + d p n , m , 2 dp_{n,a_n,0}+dp_{n,m,2} dpn,an,0+dpn,m,2

具体实现上,使用滚动数组,其次,这道题有点卡常,所以尽量减少取模次数就行了。

贪吃蛇

真正意义上的签到题,然而少打了个记忆化挂了 20 p t s 20pts 20pts

考虑单独处理每一个 ( i , j ) (i,j) (i,j),用类似于 b f s bfs bfs 方式扩展当前能走到的区域,用优先队列存储未被暂时不能吃掉的点,然后乱搞,当然有两个剪枝:

  • 当前权值大于矩阵最大权值,显然合法。
  • 走到了一个已经处理过的合法格子,显然当前 ( i , j ) (i,j) (i,j) 也跟着合法了。

最坏时间复杂度: O ( n 2 m 2 log ⁡ n m ) O(n^2m^2\log nm) O(n2m2lognm),然而跑的飞快,我最慢的点只跑了 200 m s 200ms 200ms,比 std 快了十倍。 (雾

蛋糕

神仙题,当然仅指 zdj 学长的做法,std 做法啥也不是。

首先看到这道题,很自然得到一个朴素 O ( n V ) O(nV) O(nV) d p dp dp
d p i , j dp_{i,j} dpi,j 表示将 [ 1 , i ] [1,i] [1,i] 全部变为 0 0 0,且使用了 j j j 次横切操作的最小代价。
然后有转移 d p i , j = min ⁡ ( d p i − 1 , j + max ⁡ ( a i − j , 0 ) , d p i , j − 1 + s u f i + 1 ) dp_{i,j}=\min(dp_{i-1,j}+\max(a_i-j,0),dp_{i,j-1}+suf_{i+1}) dpi,j=min(dpi1,j+max(aij,0),dpi,j1+sufi+1),其中 s u f suf suf 表示后缀最大值。


原文地址:https://blog.csdn.net/cqbzliuhongyi/article/details/142796209

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!