3 条题解
-
0
dp算法
能接雨水的条件是中间比左右两边都低,所以我们遍历两次,第一次,从左到右遍历一遍,以左边的高度为标准,去接雨水。第二次从右到左遍历一遍,以右边高度为标准去接雨水,由于左右高度是以低的高度作为标准,所以遍历比较每个位置的两次所取的雨水值,取低的加起来即为答案
#include<bits/stdc++.h> using namespace std; # define N 30005 int n,a[N],b[N],dp1[N],dp2[N],sum=0; int main() { cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; b[i]=a[i]; } for(int i=2;i<n;i++) #从左到右 { if(a[i]>=a[i-1]) { dp1[i]=0; } else if(a[i]<a[i-1]) { dp1[i]=a[i-1]-a[i]; a[i]=a[i-1]; } } for(int i=n-1;i>=2;i--) #从右到左 { if(b[i]>=b[i+1]) { dp2[i]=0; } else if(b[i]<b[i+1]) { dp2[i]=b[i+1]-b[i]; b[i]=b[i+1]; } } for(int i=2;i<n;i++) #取最小 { dp1[i]=min(dp1[i],dp2[i]); } for(int i=1;i<=n;i++) { sum+=dp1[i]; } cout<<sum; return 0; }
信息
- ID
- 108
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 5
- 标签
- 递交数
- 116
- 已通过
- 45
- 上传者