[两道题]
题一:m个0、n个1组成的集合,求不同的划分总数。
题二:给定一个整数数组,求最接近整数k的子串和。
这两题的关键都是转化。
先看第一题,构造背包,背包i有xi个0和yi个1组成,共有(m + 1) * (n + 1) - 1种背包,每种背包无限个,那么转化为选择一些背包使得xi之和为m,yi之和为n的方法总数,于是转化为完全背包问题,按xi或yi值递增顺序考虑背包避免重复。
第二题,连续和可转化为前缀和相减,于是转化为对于固定结尾j的字串,需要找它的起始位置i,使得s[j] - s[i - 1] 最接近k,这样需要一个数据结构支持动态logn的插入排序同时支持随机下标访问以便三分查找,但事实上这样的数据结构是不存在的。注意到只需要求最终的结果,于是可以全部排序,这样对结果没有任何影响,同时实现了前缀有序。算法过程:预处理前缀和,前缀和排序,扫一遍(对每个j,logn的时间找到i更新答案,另外利用单调性可以均摊o(1)的查找)。

浙公网安备 33010602011771号