题解 P1318 【积水面积】

曦行夜落

2018-11-24 21:06:47

Solution

这道题可以用类似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; } ```