很明显,这是一道橙题
别问我一个提高的入来写普及的题干啥,就是因为随机跳题,使我足足15分钟才写出来一道基础的动态规划题目,于是痛心疾首的我直接来写一篇题解来帮助刚开始学习动态规划的入(还错了一次)
思路
分为两种情况:
Impoissble
情况,直接使用前缀和来做好吧,如果最后的总和3. 小于0的话直接返回就可以了。
我们来定义状态:设 dp_i 是枚举到 i 个数的时候的最多的分组数量。
我们去枚举 i 截止到第 i 头牛为止。 与判断Impossible
的情况同理,如果到第 i 个位置的所有牛的理智度 \ge 0 就不能分为一组。
枚举端点 j 找出 i 的最优解, 当然需要判断区间是否合法。(也就是 \ge 0 )
- 状态转移 :
- 不转移情况( dp_i = dp_i )
- 转移情况( dp_i = \max(dp_i, dp_j + 1) )
核心代码:
for_(i, 1, n)
{
if(sum[i] >= 0)
{
for_(j, 0, i - 1)
{
if (sum[i] - sum[j] >= 0)
dp[i] = max(dp[j] + 1, dp[i]);
}
}
}