【CF1197D】Yet Another Subarray Problem

阳光穿透心脏的1/2处 2023-06-05 08:54 141阅读 0赞

Description

【CF1197D】Yet Another Subarray Problem

给定一个序列和m,k,求出一个子序列使得$\sum\limits_{i=l}^{r}{a_i}-k\times \lceil \frac{r-l+1}{m}\rceil$最大

特别地,一个长度为0的子序列的答案为0

Solution

dp

一段区间的区间和我们可以通过前缀和实现查询

定义$f[i][j]$表示以i为右端点的子序列,左端点$l$满足$(i-l+1)\mod m=j$时的最大值

那么关于状态转移,我们可以考虑在 $i-m$的位置上分段,然后从前一段转移过来还是只保留当前这一段即可

最后取一个最大值即可

Code

  1. #include <bits/stdc++.h>
  2. namespace shl {
  3. typedef long long ll;
  4. int n, m, k;
  5. ll a[300010], f[300010][12], sum[300010];
  6. inline ll read() {
  7. ll ret = 0, op = 1;
  8. char c = getchar();
  9. while (!isdigit(c)) {
  10. if (c == '-') op = -1;
  11. c = getchar();
  12. }
  13. while (isdigit(c)) {
  14. ret = (ret << 3) + (ret << 1) + c - '0';
  15. c = getchar();
  16. }
  17. return ret * op;
  18. }
  19. using std :: max;
  20. int main() {
  21. n = read(); m = read(); k = read();
  22. for (register int i = 1; i <= n; ++i) {
  23. a[i] = read();
  24. sum[i] = sum[i - 1] + a[i];
  25. }
  26. ll ans = 0;
  27. for (register int i = 1; i <= n; ++i) {
  28. if (i - m >= 0) f[i][0] = max(f[i][0], f[i - m][0] + sum[i] - sum[i - m] - k);
  29. for (register int j = 1; j < m; ++j) {
  30. if (i - j >= 0) f[i][j] = max(f[i][j], sum[i] - sum[i - j] - k);
  31. if (i - m >= 0) f[i][j] = max(f[i][j], f[i - m][j] + sum[i] - sum[i - m] - k);
  32. }
  33. for (register int j = 0; j < m; ++j) ans = max(ans, f[i][j]);
  34. }
  35. std :: cout << ans;
  36. return 0;
  37. }
  38. };
  39. int main() {
  40. shl :: main();
  41. return 0;
  42. }

转载于:https://www.cnblogs.com/shl-blog/p/11400473.html

发表评论

表情:
评论列表 (有 0 条评论,141人围观)

还没有评论,来说两句吧...

相关阅读

    相关 CF1197A

    CF1197A 题意: > 定义k阶梯子为两边各一块木板长度至少k+1,中间k块木板至少为1 。问 给你n块木板,最多能搭成几阶的梯子。 解法: >...

    相关 CF1197B

    CF1197B 题意: > 出n个柱子,每个柱子一个圆盘,其半径各不相同,每次只能将柱子上只有一个圆盘的移到相邻位置,问能否全部移到一个柱子上。 解法:...

    相关 【DP】CF1096D Easy Problem

    题意: 现在有一个由小写字母组成的[字符串][Link 1],去掉这个字符串的第i个位置的字符会有ai的代价。你的任务是去掉这个字符串中的一些字符使得该字符串中不包含子序列h

    相关 uva 11490 ——Just Another Problem

    题意:刚开始并没有看懂,耐着性子硬读下去,才勉强弄懂大意,英语也要加强训练啊! 题目是说你有s行c列士兵,然后带着他们去打仗,为了虚张声势,在士兵的中间缺了两个边长为r的洞