高中OJ 3792. 【NOIP2014模拟8.20】分队问题

优化贪心算法至DP
本文探讨了将初始贪心算法思路转化为动态规划(DP)方法的过程,解决了原方案中存在的问题,并通过引入辅助数组M来优化算法的时间复杂度。

这题刚开始是想用贪心,结果因为数组少打了1个0所以少了40分。。。


先说说贪心的思想。

因为组数要尽量分多,所以我们可以从大到小排序,就是把大的数放在一堆组成一队,剩下的较小数就可以组成更多的队伍。

反例:

1 2 4 5 5 5 5 5

如果我们从右往左找,把5个5分成一队,剩下的就不足4人,所以无法成立。

所以正解应该是这样:

(1 2) (4 5 5 5 5 5)


所以我们可以把贪心转化成DP:

设F[i]表示从1到i能组成队伍数的最大值。

根据之前的结论,可以很容易推出方程:

F[i]=max(F[j]+1) (1≤j≤i-a[i])


But——

这种方法的时间复杂度是近似O(N^2),所以会超时。


如何优化?

通过观察,我们可以发现方程中的max(F[j])其实就是求1~j中最大的F[j],

所以我们可以设一个数组M,M[i]表示从1~i中最大的F[i]。

因此方程可以转化成F[i]=M[i-a[i]]+1,直接从二维降到了一维。

因为最大值保持不降的,所以每次算出F[i]后就把M[i]更新。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值