Problem Notes

Revision en3, by SXWisON, 2023-12-20 19:31:17

1359D - Yet Another Yet Another Task

SXWisON molingspance

本题中可以采用动态规划中Kadane’s algorithm来实现

原型

Question: 已知序列a[i];找出最优的索引l,r使得a[l]+...+a[r]的值最大

Kadane’s algorithm:

localMax = Math.max(nums[i], localMax + nums[i]);

max = Math.max(max, localMax);

本题思路

假定一个最值mx,将其从1~30遍历

对于任意大于mx的数字,将其设为-INF,使优化过程只考虑x<=mx的值

localMax = Math.max(nums[i], localMax + nums[i]);

max = Math.max(max, localMax-mx);

Code

#include <iostream>
#include<algorithm>

int a[100010];

typedef long long int LL;
constexpr int INF = 10e9;

int main() {
  // 读取数据
  int n;
  std::cin >> n;
  for (int i = 0;i < n;i++) {
    std::cin >> a[i];
  }
  // 迭代
  LL Gmax = 0;
  for (int mx = 1; mx <= 30; mx++) {
    LL Lmax = 0;  // 局部最大值(指单个mx
    LL cur = 0;    // 当前最大值
    for (int i = 0; i < n; i++) {
      LL val = (a[i] > mx) ? -INF : a[i];
      cur = std::max(val, cur + val);
      Lmax = std::max(cur, Lmax);
    }
    Gmax = std::max(Lmax - mx, Gmax);
  }
  std::cout << Gmax;
  return 0;
}
Tags dp

History

 
 
 
 
Revisions
 
 
  Rev. Lang. By When Δ Comment
en4 English SXWisON 2023-12-21 07:12:58 533 Tiny change: '\n#include<algorithm' -> '\n#include <algorithm'
en3 English SXWisON 2023-12-20 19:31:17 25 Tiny change: 'r:SXWisON][user:moli' -> 'r:SXWisON] [user:moli'
en2 English SXWisON 2023-12-20 19:30:20 54 Tiny change: '本题中可以采用动态规' -> '[problem:1359D]\n[user:SXWisON][user:molingspance]\n\n本题中可以采用动态规'
en1 English SXWisON 2023-12-20 19:24:31 1014 Initial revision (published)