【学习笔记】dp 状态与转移

Ehab and the Expected GCD Problem

思维还是慢了一步 。

observations + dp 。

这题难在 dp 阶段的设计 。 我们考虑从前往后向序列中填数 ,同时记录当前前缀 gcd 状态。

dp[i][j][k] 表示考虑了前 i 个数,前缀 gcd ⁡ = 2 j 3 k ( k = 0 / 1 ) \gcd=2^\text{j}3^\text{k}(k=0/1) gcd=2j3k(k=0/1) 。转移是巧妙的 。(乘法原理)

Three Servers

看完题意我是 joker …

简单的背包问题可以让你怀疑人生 …

可达性 dp -> 最优性 dp

observations + dp

同为可达性 dp :https://blog.csdn.net/cqbzlydd/article/details/124870640?spm=1001.2014.3001.5501

Hero meet devil

毋宁是状压好题 。

observations + dp

Min Product Sum

dp(x)
数学(v)

干瞪眼大法 …

我怎么看不懂题解啊

Salvage Robots

大受震撼 …

强行构造状态和dp阶段 …

膜拜 idsy …

考虑中间有一个安全区域 … 四周为危险区域 …

请添加图片描述考虑将安全区域拖动,这样危险区域中的一些 robot 会被甩出去 …

d p [ a ] [ b ] [ c ] [ d ] dp[a][b][c][d] dp[a][b][c][d] 表示安全区域左上角为 ( a , b ) (a,b) (a,b),右下角为 ( c , d ) (c,d) (c,d) ,在危险区域能救起的 robot 的最大数量 。

至于转移,预处理 Up[i][l][x] 表示第 i 列 [1,l] 的 robot 向上移动不超过 x 步能到达 E 的数量

上下左右四个方向类似 。

转移时考虑这个安全区域往里缩 :

请添加图片描述

d p [ a ] [ b ] [ c ] [ d ] + ? → d p [ a ] [ b + 1 ] [ c ] [ d ] dp[a][b][c][d]+?\to dp[a][b+1][c][d] dp[a][b][c][d]+?dp[a][b+1][c][d]

上下左右四个方向同理 。

答案 max ⁡ ( d p [ i ] [ j ] [ i ] [ j ] + 1 ) ( s [ i ] [ j ] = o ) \max(dp[i][j][i][j]+1)(s[i][j]=o) max(dp[i][j][i][j]+1)(s[i][j]=o) 。因为最后一个 robot 一定是安全的 。

这题的状态和阶段太难想到了 。毋宁称之为构造dp题 。

Prefix Median

咕咕咕 。。。

Min Product Sum

dp 状态好难想啊 …

毋宁将每行每列的最小值找出来 ,然后再考虑 ( i , j ) (i,j) (i,j) 能填哪些数

当然对于一组 x 1 ∼ n x_{1\sim n} x1n y 1 ∼ m y_{1\sim m} y1m 能写出方案数为 ∏ ( i , j ) ( K − max ⁡ ( x i , y j ) + 1 ) \prod_{(i,j)}(K-\max(x_i,y_j)+1) (i,j)(Kmax(xi,yj)+1)

当然实际情况中可能没有任何一个矩阵合法,但是我们并不关心 。

对于该矩阵的权值,可以表示为 ∏ ( i , j ) min ⁡ ( x i , y j ) \prod_{(i,j)}\min(x_i,y_j) (i,j)min(xi,yj)

对于所对应的方案数,我们通过容斥计算 。

假设我们枚举不合法的行列数量,不难得到容斥系数 ∑ r ∑ c ( − 1 ) r + c \sum_{r}\sum_{c}(-1)^{r+c} rc(1)r+c

对于不合法的行或列令 x i → x i + 1 x_i\to x_i+1 xixi+1 y j → y j + 1 y_j\to y_j+1 yjyj+1 ,再算一遍 。

这样暴力做法 ( 2 K ) n + m (2K)^{n+m} (2K)n+m

那么关键在于设计一个 d p dp dp 把上面的容斥系数也 rua 进去 ,同时把方案数和权值也 rua 进去

激动人心的时刻来了 。。。

f [ t ] [ i ] [ j ] f[t][i][j] f[t][i][j] 表示当前考虑了 ≤ t \le t t 的元素, i i i 行, j j j 列的值已经确定的贡献

因为 t t t 是按顺序加入的,所以我们在状态转移时系数是可算的 。

  • 加入 a a a 行不被容斥: f [ t ] [ i + a ] [ j ] ← f [ t − 1 ] [ i ] [ j ] ⋅ ( n − i a ) ⋅ t a ( m − j ) ⋅ ( K − t + 1 ) a j f[t][i+a][j]\gets f[t-1][i][j]\cdot \binom{n-i}{a}\cdot t^{a(m-j)}\cdot (K-t+1)^{aj} f[t][i+a][j]f[t1][i][j](ani)ta(mj)(Kt+1)aj
  • 加入 a a a 行被容斥: f [ t ] [ i + a ] [ j ] ← f [ t − 1 ] [ i ] [ j ] ⋅ ( n − i a ) ⋅ t a ( m − j ) ⋅ ( K − t ) a j ⋅ ( − 1 ) a f[t][i+a][j]\gets f[t-1][i][j]\cdot \binom{n-i}{a}\cdot t^{a(m-j)}\cdot (K-t)^{aj}\cdot (-1)^a f[t][i+a][j]f[t1][i][j](ani)ta(mj)(Kt)aj(1)a

加入 b b b 列是对称的就不写了 。

注意转移顺序哦 qwq 。做法 O ( K N M ( N + M ) ) O(KNM(N+M)) O(KNM(N+M)) 。轻微卡常 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值