这题刚开始是想用贪心,结果因为数组少打了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]更新。