第九章 動態規劃-1302:股票買賣

1302:股票買賣

時間限制: 1000 ms 內存限制: 65536 KB

【題目描述】
最近越來越多的人都投身股市,阿福也有點心動了。謹記着“股市有風險,入市需謹慎”,阿福決定先來研究一下簡化版的股票買賣問題。

假設阿福已經準確預測出了某隻股票在未來N天的價格,他希望買賣兩次,使得獲得的利潤最高。爲了計算簡單起見,利潤的計算方式爲賣出的價格減去買入的價格。

同一天可以進行多次買賣。但是在第一次買入之後,必須要先賣出,然後纔可以第二次買入。

現在,阿福想知道他最多可以獲得多少利潤。

【輸入】
輸入的第一行是一個整數T(T≤50),表示一共有T組數據。

接下來的每組數據,第一行是一個整數N(1≤N≤100,000),表示一共有N天。第二行是 N 個被空格分開的整數,表示每天該股票的價格。該股票每天的價格的絕對值均不會超過1,000,000。

【輸出】
對於每組數據,輸出一行。該行包含一個整數,表示阿福能夠獲得的最大的利潤。

【輸入樣例】
3
7
5 14 -2 4 9 3 17
6
6 8 7 4 1 -2
4
18 9 5 2
【輸出樣例】
28
2
0
【提示】
對於第一組樣例,阿福可以第1次在第1天買入(價格爲5),然後在第2天賣出(價格爲14)。第2次在第3天買入(價格爲-2),然後在第7天賣出(價格爲17)。一共獲得的利潤是(14-5)+(17-(-2))=28。

對於第二組樣例,阿福可以第1次在第1天買入(價格爲6),然後在第2天賣出(價格爲8)。第2次仍然在第2天買入,然後在第2天賣出。一共獲得的利潤是8-6=2。

對於第三組樣例,由於價格一直在下跌,阿福可以隨便選擇一天買入之後迅速賣出。獲得的最大利潤爲0。


思路:分析:從頭找兩個數最大的方案,從尾找兩個數最大的方案,再找到一個點求出最大值。

狀態轉移方程
minn=min(minn,a[i]);//找出最小值
f1[i]=max(f1[i-1],a[i]-minn);//用最小值求最大值
maxx=max(maxx,a[i]);//找出最大值
f2[i]=max(f2[n+1],maxx-a[i]);//用最大值求最大值
ans=max(ans,f1[i]+f2[i]);求出兩個和

#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
 
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int N =100000+5;
int f[N];
int a[N];
int maxx[N];//存放到目前爲止最大值
int minn[N];//存放到目前爲止最小值
int n;
int i,j,T;
int ans;
 
void initial()
{
    for(i = 1;i <= n;i++)
        scanf("%d",a+i);
    return ;
}
 
int main()
{
    int f2[N];//i----n差的最大值
    int f1[N];//1---i差的最大值
    cin>>T;
    while(T--)
    {
        scanf("%d",&n);
        initial();
 
        ans = -INF;
        minn[1] = a[1];
        f1[1] = 0;
        for(i = 2;i <= n;i++)
        {
            minn[i] = min(minn[i-1],a[i]);
            f1[i] = max(f1[i-1],a[i]-minn[i]);
        }
 
        maxx[n] = a[n];
        f2[n] = 0;
        for(i = n-1;i >= 1;i--)
        {
            maxx[i] = max(maxx[i+1],a[i]);
            f2[i] = max(f2[i+1],maxx[i]-a[i]);
        }
 
        for(i = 1;i <= n;i++)//選取交接點
            if(ans < f2[i]+f1[i])
                ans = f2[i]+f1[i];
 
        printf("%d\n",ans);
    }
 
    return 0;
 
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章