本文主要是介绍HZOJ-270:最大子序和,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目描述
输入一个长度为 n� 的整数序列,从中找出一段不超过 M� 的连续子序列,使得整个序列的和最大。
例如 1,−3,5,1,−2,31,−3,5,1,−2,3:
当 m=4�=4 时,S=5+1−2+3=7�=5+1−2+3=7;
当 m=2�=2 或 m=3�=3 时,S=5+1=6�=5+1=6。
输入
第一行两个数 n,m�,�。
第二行有 n� 个数,要求在 n� 个数找到最大子序和。
输出
一个数,数出他们的最大子序和。
样例输入
6 4
1 -3 5 1 -2 3
样例输出
7
#include <iostream>
#include <vector>
#include <set>
#include <deque>
#include <algorithm>
using namespace std;
vector<int> arr;int main() {int n, k;cin >> n >> k;arr.push_back(0);for (int i = 1, a; i <= n; i++) {cin >> a;a = a + arr[i - 1];arr.push_back(a);}deque<int> q;int ans = 0;for (int i = 0; i <= n; i++) {while (!q.empty() && arr[q.back()] > arr[i]) q.pop_back();q.push_back(i);if (i - q.front() > k) q.pop_front();if (arr[i] - arr[q.front()] > ans) ans = arr[i] - arr[q.front()];}cout << ans;return 0;
}
这篇关于HZOJ-270:最大子序和的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!