思路
考虑以每个端点i为结尾的子数组和
d
p
[
i
]
dp[i]
dp[i],满足
a
n
s
=
∑
i
=
1
n
d
p
[
i
]
ans=\sum_{i=1}^n dp[i]
ans=∑i=1ndp[i]
其中,若已知dp[i-1],那么dp[i]就是在参与贡献dp[i-1]的i个区间上添加了a[i],故
d
p
[
i
]
=
d
p
[
i
−
1
]
+
i
×
a
[
i
]
dp[i] = dp[i-1]+ i × a[i]
dp[i]=dp[i−1]+i×a[i]
且
d
p
[
0
]
=
0
dp[0]=0
dp[0]=0
代码
#include<bits/stdc++.h>
using namespace std;
vector<double> preSum;
int main() {
int n;
cin >> n;
vector<long double> arr(n), dp(n + 1);
for(int i = 0;i < n;++i)
cin >> arr[i];
long double sum = 0;
dp[0] = 0;
for(int i=1;i<=n;++i) {
dp[i] = dp[i-1] + arr[i-1] * (i * 1.0);
sum += dp[i];
}
printf("%.2llf\n", sum);
}