Typical DP Contest 社论

站❤长❤推❤荐

洛谷题单 . 可以做做 .

有小数的精度要求都是 106 大概 . 图默认是简单图 .

A. コンテスト

给序列 {an},问在 {a} 中选若干数加起来能得到多少不同的数 .

1n,ai100 .

01 背包即可,实现的好的话时间复杂度 Θ(nV/w) .

B. ゲーム

两个堆 S1,S2,Alice 和 Bob 轮流操作,每次选一个堆取出堆顶,每个人都想要让自己取出的数之和最大 . 问 Alice 最后取出的数的和是多少 .

两个堆的大小均不大于 103 .

比较朴素,类似 AtCoder DP 26 题的 L. Deque,时间复杂度 Θ(n2) .

C. トーナメント

2k 个人打淘汰赛(形如一棵满二叉树),其中第 i 个人 Elo Rating 为 ri .

p 和人 q 对战,人 p 获胜的概率为 11+10(rqrp)/400,问最后每个人获胜的概率 .

1k10 .

dpk,i 表示第 k 轮后第 i 个人存留的概率,则不难得到转移:

dpk,i=dpk1,ijSk,iprob(j,i)dpk1,j

其中 Sk,i 表示第 k 轮能和 i 比赛的人,prob(j,i) 表示 ji 的概率 .

时间复杂度 Θ(k2k) .

D. サイコロ

将一个六面骰子掷 n 次,问每次掷得点数之积为 d 的倍数的概率 .

1n1001d1018 .

因为只有六面,所以乘积肯定只有素因子 2,3,5,那么考虑令 dpn,a,b,c 表示掷 n 次,最终 2,3,5 因子的次数分别为 a,b,c 的概率 . 那么可以朴素转移 .

时间复杂度 O(nlogd) .

E. 数

计数 [1,n] 内数位和是 d 的倍数的数的数量,对 109+7 取模 .

1n10100001d100 .

和 AtCoder DP 26 题的 S. Digit Sum 是完全一致的题目 .

考虑数位 DP,令 dpx,e 表示到第 x 位且目前数位和 se(modd)0e<d)的答案,然后可以朴素转移 .

时间复杂度 Θ(dlgk) .

F. 準急

1n 中的若干数,计数选择方案,要求满足:

  • 选中 1,n .
  • 不能选中连续的 k 个数 .

109+7 取模 .

1kn106 .

dpn,0/1 表示选 1n 且不选 / 选 n 的方案数,那么有转移:

dpn,0=dpn1,0+dpn1,1dpn,1=dpn1,0+dpn1,1dpnk,0

时间复杂度 Θ(n) .

G. 辞書順

给一个长为 n 的字符串 S,求其字典序第 k 小的非空子序列,重复(字符串本质不同当且仅当看起来不一样)只算一次,不存在输出 Eel .

1n1061k1018,字符集为小写字母 .

不难想到按位考虑,所以其实只需要算 in 中强制选 i 的本质不同子序列数量 .

考虑在子序列自动机上 DP . 具体的,令 next(i,c) 表示 i 之后第一个 c 的位置,dpi 表示 in 中强制选 i 的本质不同子序列数量 . 考虑重复情况只计算选择位置字典序最小的那个,于是可以得到转移:

dpi=1+cdpnext(i,c)

不过 dp 的真实值可能很大,可以和 k+1 取 min,不会丢失需要的信息 .

时间复杂度 Θ(nS),其中 S=26 是字符集大小 .

H. ナップザック

n 个物品,每个物品有质量、价值和颜色 . 要求放入一个背包中,容量上限为 w,颜色种类数上限为 c,求最大价值和 .

1n1001w1041c50 .

dpi,j,k 表示选 1i 中的颜色,选了 j 种颜色,质量和为 k 的答案,那么在 1i 加入 i+1 肯定颜色种类数多 1,于是就可以简便处理颜色种类数了 . 转移类似 01 背包转即可 .

时间复杂度 Θ(n+wc2) .

I. イウィ

给一个长度为 n 的仅含 i, w 的字符串 S,每次可以删一个子串 iwi,问最多能删几次 .

1n300 .

dpl,r 表示 S[l:r] 是否能被删空,可以朴素区间 DP 处理 .

那么把所有 dp 值为 1 的区间全部拿出来,就变成了选若干不交区间使得其并的大小最大的问题,可以反悔贪心做 .

经过一些简单分析可以知道时间复杂度为 Θ(n3) .

J. ボール

n 个物品,第 i 个在 xi 处 . 向坐标 x 扔球时,均匀随机击中坐标 x1,x,x+1 中的一个 . 问在最优策略下期望扔球多少次能打倒所有物品 .

1n160xi15 .

dpS 表示打到 S 内所有物品的期望步数,则考虑投 x 位置期望扔多少步:

Es,x=1+13p[x1,x+1]{p}SdpS{p}+(113p[x1,x+1][pS])Es,x

那么解出 Es,x 后做转移 dpS=minx{Es,x} 即可 .

时间复杂度 Θ(n2n) .

K. ターゲット

如果一组圆满足前面的圆总是严格包含于后面的圆,则称其为一个靶子,且大小为圆的数量 .

现有 n 个圆,第 i 个圆心为 (xi,0),半径为 ri . 问选若干个圆最大可以组成多大的靶子 .

1n105 .

其实就是若干区间问最多可以嵌多少层,两个区间 [l1,r1],[l2,r2] 满足条件当且仅当 l1<l2,r1>r2 . 那么按 l 排序后找最长下降子序列即可 .

时间复杂度 Θ(nlogn) .

L. 猫

n 只猫,第 i 只在位置 xi,满足 {x} 是单调递增的实数序列 . 猫 i 和猫 j 的友好指数为 fi,j,猫 i 的幸福指数是与其距离不超过 1 的猫和她的友好指数之和 .

现给定 f,对于任意序列 {x},问所有猫幸福指数和的最大值 .

1n103 .

首先把答案除以 2,那么对于 j<idpi,j 表示 i,j 距离不超过 11i 的最大答案,则:

dpi,j=maxk=1j{dpi1,k}+k=jifi,k

动态记一下前面的 max 就可以 Θ(1) 转移了 .

时间复杂度 Θ(n2) .

M. 家

h 层图,每层图都一模一样,有 r 个点,从 h 层的 1 号点到 1 层的一号点,每次可以做下列操作之一:

  • 沿着边走一步 .
  • 层数减一 .

问不经过相同点的方案数,对 109+7 取模 .

2h1091r16,8s .

就是经典问题 AtCoder DP 26 题的 R. Walk 的简单变形 .

首先求出矩阵 A,其中 Ai,jij 的简单路径条数,则答案即为 A1,1h .

r 比较小,于是 A 可以状压求 . 时间复杂度 Θ(2rr3+r3logn) .

N. 木

给一棵 n 个点的树,一种加边顺序是合法的当且仅当任意时刻所有边的端点全部连通 . 求合法加边顺序数,对 109+7 取模 .

1n103 .

考虑枚举最开始删哪条边,然后划分为两个子树的话就比较容易了,因为有删边顺序是从祖先到后代 . 对于每棵子树分别 DP 求出方案数后合并即可 . 转移可以考虑依次合并子树 .

那么只需要考虑如何合并子树,若子树 u,v 内的边数分别为 e(u),e(v),方案数分别为 c(u),c(v),则看成格路计数即可得到合并后的方案数为 (e(u)+e(v)e(u))c(u)c(v) .

时间复杂度 Θ(n2) .

O. 文字列

给序列 {w},问小写字母 c 出现 wc 次的字符串数量,对 109+7 取模 .

0wc10 .

首先二项式反演,令 fn 为钦定 n 个位置的方案数,那么考虑依次加入每个字母 .

那么整个字符串就被分成 wcn 个连续段,枚举钦定位置数后分成若干连续段,分割方案数可以用组合数描述,那么可以得到转移:

fn=i=1n(ni)(wc1wci)fni

那么答案即为:

ans=i1(1)ifi

时间复杂度 O((wc)2S),其中 S 是字符集大小 .

P. うなぎ

给一棵 n 个点的树,求选出 k 条至少包含两个顶点的链,且任意两条链在顶点上不交的方案数,不一定要覆盖整棵树 .

2n10001k50

dpu,i,s=0/1/2/3 表示 u 子树内选 i 条链,其中:

  • s=0u 未被链覆盖 .
  • s=1u 是一条直链上深度最大的点 .
  • s=2u 在一条直链上 .
  • s=3u 在一条非直链上 .

转移略,时间复杂度 Θ(nk2) .

Q. 連結

n 个 01 串 {wn},找几个按任意顺序拼接,一个字符串可以选多次,问拼出来的本质不同的长为 L 的串个数,对 109+7 取模 .

1n5101|wi|81L100 .

和 SDOI2009 学校食堂那个题差不多 .

本质不同比较难处理,那么就考虑一位一位的拼出最终字符串,那么因为字符串长度都比较小,于是只需要维护最近 7 位的状态和分隔符即可 .

具体的,令 dpn,S1,S2 表示长为 n 的字符串,最后 7 位状态为 S1,拼接分隔符状态为 S2 的串个数,转移相对平凡,不表 .

时间复杂度 Θ(nm+L22m),其中 m=max{wi},可以通过 .

R. グラフ

n 个点的有向图,选两条路径(不用简单),最大化被覆盖过的点的总数 . 只需输出最大数量 .

1n300 .

首先缩点变成 DAG 上问题 . 考虑加虚拟源汇点 s,t 后变成找 st 的两条路径 .

于是令 dpu,v 表示两条路径 su,sv 的最大覆盖总点数,枚举出边转移即可 .

时间复杂度 O(n3),可以通过 .

S. マス目

给一个 n×m 网格,将其黑白染色,要求:

  • (1,1),(n,m) 染黑色 .
  • 存在一条从 (1,1)(n,m) 的只经过黑色点的路径 .

求方案数,对 109+7 取模 .

2n62m100 .

肯定是按列考虑,不过只维护目前列的状态不能统计答案 . 把网格划分为若干黑色连通块,限制就是 (1,1),(n,m) 处于同一连通块内,则可以考虑记录从属于连通块的状况 .

具体的,因为只有最多 6 行所以最多 3 个连通块,对于四进制数 S,0/1/2/3 分别表示白位置,和 (1,1) 连通和两个别的连通块 . dpn,S 表示处理到前 n 列,第 n 列状态为 S 的方案数 . 注意因为我们只关注 1 所以 2, 3 其实是无序的需要人为钦定一个顺序 . 转移就枚举一列状态并查集维护连通性即可 .

不算并查集复杂度,看起来时间复杂度是 O(m8n) 的,也不是不能过 . 不过可以分析到更小一点,暴搜可以知道 n=6 时合法的状态 S 的数量 S(6)=196,所以离散化后可以得到准确时间复杂度是 Θ(m2nS(n)),这是远小于 m8n 的 .

T. フィボナッチ

如下定义序列 {a}

an={1nki=1kanin>k

给定正整数 n,k,求 an . 对 109+7 取模 .

1n1092k103 .

算行列式或者直接看答案 OGF 的分母就知道特征多项式:

g(λ)=λkλk11

然后暴力做 Fiduccia 算法后面的部分就行了,时间复杂度 Θ(k2logn) .

posted @   yspm  阅读(212)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
😅​
点击右上角即可分享
微信分享提示