早上起来补题发现没人写题解,我来混一手O.o
题意,给一串数组,数组直接可分割,求最大值sum;比如:[1,-3,7,-6,2,5],可拆为
[1][−3,7][−6,2][5],sum=1*1+2*(-3+7)+3*(-6+2)+4*(5);
解法,dp加贪心思想,使用后缀和来维护数组
代码:
#include<iostream>
#include<sstream>
#include <cstdio>
#include<stack>
#include<vector>
#include<list>
#include<iomanip>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm>
#include<utility>
#include<cctype>
#include<cstdio>
#include<map>
#include<set>
#define int long long
using namespace std;
int a[100050];
int dp[100050];
int sum[100050];
void solve() {
int n;
int i;
cin >> n;
int ans=0;
for (i = 1; i <= n; i++) {
cin >> a[i];
ans += a[i];
}
sum[n] = a[n];
for (i = n-1; i >=1; i--) {
sum[i] = sum[i + 1] + a[i];
}
memset(dp, 0, sizeof dp);
dp[1] = ans;
for (i = 2; i <= n; i++) {
dp[i] = max(dp[i - 1], dp[i - 1] + sum[i]);
}
cout << dp[n] << endl;
}
signed main() {
ios::sync_with_stdio(0); cin.tie(0), cout.tie(0);
int t;
cin >> t;
while (t--) {
solve();
}
return 0;
}