分享一道题目。给出一个长不过 100 的数字(不含前导0)。问你是否可以删除若干个数位(不能全部删除),使得剩余部分可以被 8 整除。如果可以输出任意一组结果。
首先想到 dp,
dpi,j
表示前面
i
个数位,得到模
然而这个题目再考虑一下的话,因为数字只有 100 这么长, O(8n) 显得太富裕。我们发现: 1000%8=0 。这个说明什么?如果一个数能被 8 整除,那么数的最后三位也能被 8 整除。所以我们得到结论,如果给出的数中有一个子序列能被 8 整除,那么就有一个长小于等于 3 的子序列能被 8 整除。所以我们只要枚举长度小于等于 3 的子序列,一次判断即可。复杂度是 O(n3) 。
虽然后者的复杂度更高,但是我个人还是更喜欢第二种做法。