这道题可以用类似Dp解决~~(LJ:Dp,Dp,D个p)~~
状态——$dp_{i}$表示第i格填水后连水带块的最大高度
转移——$dp_{i}=max(a_{i},min(dp_{i-1},dp_{i+1}))$
边界——初始$dp_{i}=a_{i}$
答案——$ans=sigma(dp_{i}-a_{i})$
显然这个Dp是有后效性的(i状态由左右两个状态决定)
### 子曰:“后效性Dp多跑几遍就能过”
于是乎多跑几遍就过了
------------
```cpp
#include<bits/stdc++.h>
#define maxn (10000+50)
using namespace std;
int a[maxn],f[maxn];
int main()
{
int n;
scanf("%d",&n);
for (int i=1;i<=n;++i) scanf("%d",&a[i]),f[i]=a[i];
for (int i=2;i<n;++i) f[i]=max(a[i],f[i-1]);
for (int i=n-1;i>1;--i) f[i]=max(a[i],f[i+1]);
for (int kase=0;kase<100;++kase)
for (int i=2;i<n;++i)
f[i]=max(a[i],min(f[i-1],f[i+1]));
long long ans=0;
for (int i=1;i<=n;++i)
ans+=f[i]-a[i];
printf("%lld\n",ans);
return 0;
}
```