Solution
T1
考虑 O ( n 2 ) O(n^2) O(n2)暴力: 枚举 a , b a,b a,b,然后求出对应的 c c c,更新答案。
这种做法会T掉。虽然我们可以将时间复杂度优化到 O ( n ) O(n) O(n),可事实上暴力大力剪枝+卡常就能过。
①对于一个 a a a,我们将 b b b先从 0 − 3 0-3 0−3枚举一遍,如果这些 b b b都不行,那么这个 a a a就不行了;直接break;
②得到一个 c c c的特解后,每次将 c c c加 4 4 4而不是加 1 1 1,这样可以保证对于每一个 c c c,都存在一个自然数 b b b;
③把;改成;
④在循环的 i n t int int前加上个 r e g i s t e r register register;
⑤不要开 l o n g l o n g long\ long long long。
于是这样不开O2都能过。
T2
裸的超纲整数拆分问题。
首先,我们考虑 d p dp dp。 d p dp dp有两种做法:
①无限背包(以 1 − n 1-n 1−n中每一个数为一个物品,价值均为 1 1 1,背包容量为 n n n且必须装满)
②另外一种 d p dp dp。
状态设计: d p i , j : dp_{i,j}: dpi,j: 目前选了 i i i个数,和为 j j j。
状态转移: d p i , j = d p i , j − i + d p i − 1 , j − 1 dp_{i,j}=dp_{i,j-i}+dp_{i-1,j-1} dpi,j=dpi,j−i+dpi−1,j−1
这个状态转移式是什么意思呢? d p i , j − i dp_{i,j-i} dpi,j−i可以认为是将 d p i , j − i dp_{i,j-i} dpi,j−i表示的序列的所有数加 1 1 1, d p i − 1 , j − 1 dp_{i-1,j-1} dpi−1,j−1表示将 d p i − 1 , j − 1 dp_{i-1,j-1} dpi−1,j−1所表示的序列最后面多上一个 1 1 1。相当于我们可以将一个序列全局加 1 1 1,或者在最后面添上一个 1 1 1,显然这个序列一直是有序的。
这两种 d p dp dp都是 O ( n 2 ) O(n^2) O(n2)的。它们各有所长——
①假设物品的数量为

本文深入解析三道竞赛编程题目,涵盖高效剪枝暴力算法、根号分治优化DP及矩阵乘法加速DP等技巧,旨在提升算法理解和实现能力。
最低0.47元/天 解锁文章
814

被折叠的 条评论
为什么被折叠?



