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;
}
0 回复
0 转发
0 喜欢
5 阅读



