zoukankan      html  css  js  c++  java
  • CF1197D Yet Another Subarray Problem

    思路:

    使用动态规划,在经典的最大子段和解法基础上进行扩展。dp[i][j]表示以第i个数为结尾,并且长度模m等于j的所有子段的最大cost。

    实现:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 const ll INF = 0x3f3f3f3f3f3f3f3f;
     5 const int N = 300005;
     6 ll a[N], dp[N][11];
     7 int main()
     8 {
     9     int n; ll m, k;
    10     while (cin >> n >> m >> k)
    11     {
    12         memset(dp, 0, sizeof dp);
    13         for (int i = 1; i <= n; i++) cin >> a[i];
    14         ll res = 0;
    15         dp[0][0] = -k;
    16         for (int i = 1; i < m; i++) dp[0][i] = -INF;
    17         for (int i = 1; i <= n; i++)
    18         {
    19             for (int j = 0; j < m; j++)
    20             {
    21                 if (j == (m == 1 ? 0 : 1))
    22                 {
    23                     dp[i][j] = max(dp[i - 1][0] + a[i] - k, a[i] - k);
    24                 }
    25                 else
    26                 {
    27                     dp[i][j] = max(dp[i - 1][(j - 1 + m) % m] + a[i], a[i] - k);
    28                 }
    29                 res = max(res, dp[i][j]);
    30             }
    31         }
    32         cout << res << endl;
    33     }
    34     return 0;
    35 }
  • 相关阅读:
    在排序数组中查找元素
    搜索旋转排序数组
    下一个排列
    括号生成(回溯法)
    PHP之表单
    PHP之超级全局变量
    PHP之数组
    PHP之字符串
    PHP之常量
    PHP之echo/print
  • 原文地址:https://www.cnblogs.com/wangyiming/p/12031533.html
Copyright © 2011-2022 走看看