2016.5.27

1.股票買賣

題目鏈接:http://noi.openjudge.cn/ch0206/8464/

心得:因爲要買賣兩次,所以需要算兩個最大值,就是說前i天的買賣最大值,和後i天的買賣最大值,加起來再算個最大值。

#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
const int maxn = 1005;
int a[100005];
int pre[100005];
int pro[100005];
int mina;
int maxa;
int main()
{
    int t;
    scanf("%d", &t);
    while (t--)
    {
        memset(pre, 0, sizeof(pre));
        memset(pro, 0, sizeof(pro));
        int n;
        scanf("%d", &n);
        for (int i = 0; i < n; i++)
        {
            scanf("%d", &a[i]);
        }
        mina = a[0];
        pre[0] = 0;
        for (int i = 1; i < n; i++)
        {
            mina = min(a[i], mina);
            pre[i] = max(pre[i - 1], a[i] - mina);//前i天買賣最大收益爲前i-1天買賣的最大收益與前i天中最便宜價格買,第i天賣的利潤中的較大值
        }
        maxa = a[n - 1];
        pro[n - 1] = 0;
        for (int i = n - 2; i >= 0; i--)
        {
            maxa = max(a[i], maxa);
            pro[i] = max(pro[i + 1], maxa - a[i]);//後n-i+1天買賣的最大收益爲後n-(i-1)+1天買賣的最大收益與第i天買入,後n-i+1天中最大價格賣出的利潤中的較大值
        }
        int res = 0;
        for (int i = 0; i < n; i++)
        {
            res = max(res, pre[i] + pro[i]);
        }
        printf("%d\n", res);
    }
    return 0;
}
点赞