【题目链接】
【思路要点】
- 有这样一个性质:对于最顶部的一些列干草堆,一定存在一种最优方案既满足高度最高,又满足底边最短。
- 由这个性质,DP即可。DP转移可以被单调队列优化。
- 时间复杂度\(O(N)\)。
【代码】
#include<bits/stdc++.h> using namespace std; #define MAXN 100005 int main() { int n; scanf("%d", &n); static int s[MAXN], x[MAXN]; for (int i = n; i >= 1; i--) scanf("%d", &x[i]); for (int i = 1; i <= n; i++) s[i] = s[i-1]+x[i]; static int q[MAXN], f[MAXN], g[MAXN], h[MAXN]; int l = 0, r = 0; for (int i = 1; i <= n; i++) { while (l<r && s[i] >= h[q[l+1]]) l++; int tmp = q[l]; f[i] = s[i]-s[tmp]; g[i] = g[tmp]+1; h[i] = f[i]+s[i]; while (l <= r && h[i] <= h[q[r]]) r--; q[++r] = i; } printf("%d\n", g[n]); return 0; }