3 条题解

  • 0
    @ 2025-3-29 17:18:54

    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
    上传者