题解:
首先发现叠的层数越高,最上面一层越窄
dp
然而普通的dp是o(n^2)的
所以要单调队列优化
代码:
#include<bits/stdc++.h> using namespace std; const int N=100007; int f[N],g[N],sum[N],q[N],l,r,n,w; int main() { scanf("%d",&n); for (int i=1;i<=n;i++)scanf("%d",&w),sum[i]=sum[i-1]+w; q[0]=n+1; for (int i=n;i;i--) { while (l<r&&sum[q[l+1]-1]-sum[i-1]>=f[q[l+1]])l++; f[i]=sum[q[l]-1]-sum[i-1]; g[i]=g[q[l]]+1; while (l<r&&f[i]-sum[i-1]<=f[q[r]]-sum[q[r]-1])r--; q[++r]=i; } printf("%d ",g[1]); return 0; }