作业介绍

多维 DP

三扔硬币

状态为 fi,0/1,0/1f_{i,0/1,0/1} ,表示:前 ii 枚硬币,第 ii 枚的状态是 0/10/1,第 i1i-1 枚的状态是 0/10/1 的方案数。

根据这个状态,就可以从 fi1,0/1,0/1f_{i-1,0/1,0/1} 这一维度的状态轻松转移,因为 i1i-1 这一维度后面两个维度就分别代表了第 i1i-1 枚和第 i2i-2 枚硬币的情况。

状态转移如下:

$$\begin{cases} f_{i,0,0}=f_{i-1,0,1}\\ f_{i,0,1}=f_{i-1,1,0}+f_{i-1,1,1}\\ f_{i,1,0}=f_{i-1,0,1}+f_{i-1,0,0}\\ f_{i,1,1}=f_{i-1,1,0} \end{cases}$$

答案为 j=01k=01fn,j,k\sum\limits_{j=0}^1\sum\limits_{k=0}^1 f_{n,j,k},其实就是 fn,0,0+fn,0,1+fn,1,0+fn,1,1f_{n,0,0}+f_{n,0,1}+f_{n,1,0}+f_{n,1,1}

其余细节:

  • 注意初始化问题,根据状态设计这个状态必须得有至少两枚硬币才能做。
  • 因此初始化 f2,0,0=f2,0,1=f2,1,0=f2,1,1=1f_{2,0,0}=f_{2,0,1}=f_{2,1,0}=f_{2,1,1}=1,那么当 n=1n=1 特判一下输出即可。

数字三角形

状态设计

fi,jf_{i,j} 为走到点 i,ji,j 的最大值

状态转移

走到点 (i,j)(i,j) 只能由 (i1,j)(i-1,j)(i1,j1)(i-1,j-1) 走过来即

fi,j=max(fi1,j,fi1,j1)+ai,jf_{i,j}=\max(f_{i-1,j},f_{i-1,j-1})+a_{i,j}

其余细节

由于最终并未规定走到最后一行的哪个点,所以对所有可能的位置求 max\max 即可

三倍经验

状态设计

fi,j,kf_{i,j,k} 为走到点 (i,j)(i,j) 且目前乘 33 次数已经用了 kk 次的最大值。

状态转移

首先走到点 (i,j)(i,j) 必然是由 (i1,j)(i-1,j)(i1,j1)(i-1,j-1) 走过来的,其次在点 (i,j)(i,j) 还可以考虑是否让当前 (i,j)(i,j) 这个数字乘以 33 所以一共有 44 种转移的情况。

$$\begin{aligned} f_{i,j,k}&=\max(f_{i,j,k},f_{i-1,j,k}+a_{i,j})\\ f_{i,j,k}&=\max(f_{i,j,k},f_{i-1,j,k-1}+a_{i,j}\times 3),k\not= 0\\ f_{i,j,k}&=\max(f_{i,j,k},f_{i-1,j-1,k}+a_{i,j})\\ f_{i,j,k}&=\max(f_{i,j,k},f_{i-1,j-1,k-1}+a_{i,j}\times 3),k\not= 0\\ \end{aligned}$$

其中前两个转移对应的是从上方走过来,后两个对应从左上方走过来。

其余细节

  • 走到第 nn 行以后,也不一定把乘 33 次数用完,所以要对第 nn 行所有位置的所有状态求 max\max
  • 初始 fi,j,kf_{i,j,k} 都为一个极小值,因为题目数据范围有负数,f1,1,0=a1,1,f1,1,1=a1,1×3f_{1,1,0}=a_{1,1},f_{1,1,1}=a_{1,1}\times 3
  • 注意开 long long。由于一行只能选择一个数字,所以 mm 可以和 nnmin\min

方格取数

22 次,然后求取得的数字最大和。可以看成两个人一起出发去走的最大和。

状态设计

fx1,y1,x2,y2f_{x_1,y_1,x_2,y_2} 为第一个人走到 (x1,y1)(x_1,y_1) ,第二个人走到 (x2,y2)(x_2,y_2) 的数字最大和。

状态转移

转移分 44 种情况(第一个人由上方或左边过来,第二个人由上或左过来。22=42*2=4 种)。且如果走到同一个点,数字只能相加一次。

其余细节

注意两个人走到同一个位置只计算一次答案。

[CSP-J 2022] 上升点列

注意到可以添加 kk 个自由点,因此两个点 i,ji,j 之间的曼哈顿距离 k+1\leq k+1 是极限。也就是说将来答案一定可以用到这 kk 个点,因此正常求出最长的二维递增子序列的最大长度,给答案加 kk 即可。

  • 状态设计:定义 fi,kf_{i,k} 为以 ii 结尾用了 kk 个自由点的最大长度。
  • 状态转移:枚举上一个点 jj,计算二者之间的距离曼哈顿距离记为 dd。若满足 dk+1d\geq k+1 则可以转移。由 fj,kd1f_{j,k-d-1} 转移,它们之间用掉 d1d-1 个自由点。

注意排序。

最长公共上升子序列

本题的状态设计融合了公共子序列和上升子序列。

状态设计:fi,jf_{i,j} 为以 aa 的前 ii 个数, bb 的前 jj 个数字且以 bjb_j 结尾的最长公共上升子序列的长度。

状态转移

  • fi,j=fi1,jf_{i,j}=f_{i-1,j} 此举为不包含 aa 的第 ii 个元素。
  • 如果包含 aia_i, 首先必须满足 ai=bja_i=b_j,那么根据最长上升子序列的转移,我们还要枚举 bjb_j 前面的某个元素,从它转移过来。
    • fi,j=max(fi,j,fi1,k+1),ai>bkf_{i,j}=\max(f_{i,j},f_{i-1,k}+1),a_i>b_k

字串距离

和编辑距离非常相似,设计 fi,jf_{i,j}ss 的前 ii 个字符和 tt 的前 jj 个字符相等后的最小值。

题目

认领作业后才可以查看作业内容。
状态
正在进行…
题目
15
开始时间
2025-8-19 0:00
截止时间
2026-8-10 23:59
可延期
24 小时