• 单个整数:表示可以建成的最高高度
将 1 和 2 放在第一层,将 3 放在第二层
题解:
我们从上往下搭 方便转移
设F[i]为后i个最多搭多少层,p[i]为最下面一层为多少
很容易得出 如果满足sum[i]-sum[j]>=p[j] 就可以转移F[i]=F[j]+1
移项sum[i]>=sum[j]+p[j] 所以我们要选出满足条件的最大sum[j]+p[j] 这样转移来的答案一定是最优的
于是开单调队列维护sum[j]+p[j]
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 const int N=100015; 7 int gi(){ 8 int str=0;char ch=getchar(); 9 while(ch>'9' || ch<'0')ch=getchar(); 10 while(ch>='0' && ch<='9')str=str*10+ch-48,ch=getchar(); 11 return str; 12 } 13 int a[N],sum[N],f[N],p[N],q[N]; 14 int main() 15 { 16 int n=gi(); 17 for(int i=1;i<=n;i++)a[i]=gi(); 18 for(int i=n;i>=1;i--)sum[i]=sum[i+1]+a[i]; 19 int ans=0,l=1,r=1; 20 for(int i=n;i>=1;i--) 21 { 22 while(l<r && sum[i]>=sum[q[l+1]]+p[q[l+1]])l++; 23 f[i]=f[q[l]]+1; 24 p[i]=sum[i]-sum[q[l]]; 25 if(f[i]>ans)ans=f[i]; 26 while(l<=r && sum[i]+p[i]<=sum[q[r]]+p[q[r]])r--; 27 q[++r]=i; 28 } 29 printf("%d",ans); 30 return 0; 31 }
转载于:https://www.cnblogs.com/Yuzao/p/7000964.html