返回题解分享
讨论 / 题解分享/ 帖子详情

接雨水 - 题解

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 阅读
回复 (0)
默认 最新
暂无回复,快来抢沙发!