思路:
使用动态规划,在经典的最大子段和解法基础上进行扩展。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 }