poj-2479 Maximum sum

来源:互联网 发布:网络信息推广发布 编辑:程序博客网 时间:2024/04/30 15:25

题目传送门:http://poj.org/problem?id=2479

此题是比较经典的动规题,left[]是从左到右的最大和,right[]是从右到左的最大和。最后左右相加判断最大值即可。

详细解释:

left[i]存的是从0到i的最大和,如果left[i]的值为负,那么left[i + 1]的值为a[i + 1],否则在此基础上加上left[i],因为如果left[i]为负的话,left[i + 1]加上一个负数就会减小最优值。right相同。

下面是代码:

#include <iostream>#include <cstdio>#include <algorithm>using namespace std;int a[50001], left_[50001], right_[50001];int main(){ios::sync_with_stdio(false);cin.tie(0);int t;cin >> t;while (t--){int n;scanf("%d", &n);for (int i = 0; i < n; i++)scanf("%d", &a[i]);left_[0] = a[0];for (int i = 1; i < n; i++){if (left_[i - 1] < 0)left_[i] = a[i];elseleft_[i] = left_[i - 1] + a[i];}for (int i = 1; i < n; i++)left_[i] = max(left_[i], left_[i - 1]);right_[n - 1] = a[n - 1];for (int j = n - 2; j >= 0; j--){if (right_[j + 1] < 0)right_[j] = a[j];elseright_[j] = right_[j + 1] + a[j];}for (int i = n - 2; i >= 0; i--)right_[i] = max(right_[i + 1], right_[i]);int res = -100000000;for (int i = 1; i < n; i++)res = max(res, left_[i - 1] + right_[i]);cout << res << endl;}return 0;}


0 0
原创粉丝点击