这种表述的题一眼dp。若没有封印规则,那么设 fif_ifi 为考虑前 iii 层的最大价值, fi=fi−1+maxj=1j≤mvi,jf_i = f_{i-1}+max_{j=1}^{j \le m}v_{i,j}fi =fi−1 +maxj=1j≤m vi,j 。而有封印规则后,我们可以设 fi,1/2f_{i,1/2}fi,1/2 为考虑前 iii 层后第一或第二大的价值,同时用 gi,1/2g_{i,1/2}gi,1/2 表示 fi,1/2f_{i,1/2}fi,1/2 中对应的选择的列数。如果当前选择的列与 gi,1g_{i,1}gi,1 相同,则由于封印规则而不能选择
fi,1f_{i,1}fi,1 转移,只能使用 fi,2f_{i,2}fi,2 ,否则仍可以选择 fi,1f_{i,1}fi,1 进行转移。
注意 m=1m=1m=1 时只能选择第一层的那一个,之后的层由于封印规则无法继续选择。
我的代码中将 fi,1/2f_{i,1/2}fi,1/2 与 gi,1/2g_{i,1/2}gi,1/2 合并为一个结构体,从而方便排序。