Acwing 271 杨老师的照相馆
“在合影时要求每一排从左到右身高递减,每一列从后到前身高也递减”,这个性质最终转化成:
1.放置同学时,只能放在每一排的最右侧 2.每一排同学个数从后往前非严格递减
然后枚举每一排可以放置的同学即可。
Acwing 272 最长公共上升子序列
状态定义时,考虑最长公共子序列和上升子序列的定义方法
优化:以B[k]为倒数第二个字符的最长公共子序列的值可以在循环时同时记录,无需每次重复。
Acwing 273 分级
难点主要在于性质的挖掘以及dp数组的定义。
优化:同最长公共上升子序列,从三重循环优化到二重循环
Acwing 274 移动服务
难点有两个:1.对于dp数组的定义,如何优化一维; 2.本题并非采用状态划分(即使用依赖状态更新当前状态),而是使用该状态更新后续依赖于此状态的其他状态
Acwing 275 传纸条
本题等价于方格取数问题,可以看作同时从(1,1)出发两个点。
难点在于构造dp数组,使用走的步数k作为第一维,使用两点的x坐标作为第二、第三维,则两点y坐标随之确定(x1+y1=x2+y2=k)
Acwing 277 饼干
本题难点在于需要先与贪心进行结合,然后再进行动态规划;另外,如何输出方案也是一个难点。
dp数组的定义和转移方程反倒不难考虑:
Acwing 280 陪审团
本题难点在于首先要自己划分801个集合,然后分别进行dp即可。注意:1.差值一定是第三维,最后枚举,这样才能保证无后向性 2.-400到400要映射到0到800。
Acwing 283 多边形
本题有一个知识点:破环为链,即使用两倍大小的链结构存储环结构!
本题难点在于如何处理乘法:因为乘法的最大值可以由两个最小值推得,因此我们除了要维护最大值之外还要维护最小值。
Acwing 284 金字塔
首先要理解什么是dfs序,然后才能进行dp
本题难点在于多组条件限制:
1.由于dfs序一定是奇数个字符,因此最后一棵子树起点k的划分为i到j-2,注意起点k是根节点,结尾j也是根节点,且每次加2.
2.枚举i和j时,若第i个字符不等于第j个字符或者i到j共j-i+1个字符为奇数,则说明其不为dfs序,跳过。
3.若k与j字符不同,说明不能构成子dfs序,也要跳过.
Acwing 312 乌龟棋
感觉像是跳格子问题的升级版。注意状态定义即可,定义好状态转移很简单。
Acwing 313 花店橱窗
本题比较坑的点在于答案可能为负数,因此初始化时必须初始化为极小的负值。
以及,由于每朵花需要放在不同的花瓶里,因此枚举时不必从1开始枚举,若当前是第i朵花,可直接从第i个瓶子开始枚举。
答案为max{dp[f][i]}(i >= f)
Acwing 316 减操作
实际上是个数学问题:等价于给定t,构造a[1]-a[2]±a[3]±…±a[n]=t。
确定每个项前面的符号后,我们可以如下推出操作位置:
性质:如果每次都选位置1,则会得到a[1]-a[2]-a[3]-…-a[n];
考虑每一项前的符号:
1.对于减号,先不做处理,最后统一选择多次位置1即可构成;
2.对于加号,则首先要进行一次减操作使其符号变为负号,最后统一选择多次位置1使其变为+号即可。
因此问题转换成如何求每一项前面的符号:
Acwing 317 陨石的秘密
如果我们定义dp[i, j, k,l]为深度为i,由j个{}、k个[]、l个()构成的表达式,则转移状态时要考虑{A}B、[A]B、(A)B三种情况(A、B均为表达式);同时还要枚举A的深度;A中{}、[]、()的数量。
可以优化状态为:深度不超过i,且由j个{}、k个[]、l个()构成的表达式。这样就只用考虑{A}B、[A]B、(A)B三种情况以及A中{}、[]、()的数量。
Acwing 318 划分大理石
多重背包+01背包空间优化。讲道理属于简单题目