fork download
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6. typedef pair<int, int> ii;
  7.  
  8. const int INF = 1e9;
  9. const ll LINF = 1e18;
  10.  
  11. template<typename T>
  12. void maximize(T& a, const T& b) {
  13. if (a < b) a = b;
  14. }
  15.  
  16. const int N = 1e5 + 5;
  17.  
  18. int n;
  19. int a[N];
  20.  
  21. ll dp[N][2]; // dp[i][0/1] = Tổng lớn nhất đạt được khi xét đến vị trí thứ i,
  22. // và có/không áp dụng thao tác lên vị trí thứ i
  23.  
  24. int main() {
  25. ios::sync_with_stdio(false);
  26. cin.tie(nullptr);
  27. cin >> n;
  28. for (int i = 1; i <= n; i++) cin >> a[i];
  29.  
  30. for (int i = 0; i <= n; i++) {
  31. for (int j = 0; j <= 1; j++) dp[i][j] = -LINF;
  32. }
  33. dp[0][0] = 0;
  34.  
  35. for (int i = 1; i <= n; i++) {
  36. // Ta đưa bài toán tính tổng i phần tử về bài toán nhỏ hơn là tính tổng i - 1 phần tử
  37. // Và từ việc biết vị trí i - 1 và i có áp dụng thao tác hay không
  38. // ta suy ra được giá trị sau cùng của a[i]
  39. for (int j = 0; j <= 1; j++) {
  40. for (int prev_j = 0; prev_j <= 1; prev_j++) {
  41. int sign = ((j ^ prev_j) ? -1 : 1);
  42. maximize(dp[i][j], dp[i - 1][prev_j] + sign * a[i]);
  43. }
  44. }
  45. }
  46.  
  47. cout << dp[n][0] << '\n';
  48. }
Success #stdin #stdout 0.01s 5292KB
stdin
3
-10 5 -4
stdout
19