1 #include <algorithm>
2 #include <iostream>
3 #include <string.h>
4 using namespace std;
5
6 const int Maxlen=1e5;
7 const int INF = 0x3f3f3f;
8 const int _INF = -0x3f3f3f;
9
10 int main(){
11
12 //局部最优解 和 全局最优解
13 //定义local[i][j]为到达第i天是最多可进行j次交易且最后一次交易在最后一天的最大利润 为局部最优解
14 //定义global[i][j]为到达第i天最多可以进行j次交易的最大利润为全局最优解
15 //给定每天的股票价格
16 //遍历,计算出第x天之前的一次交易可以得到的最大效益,存储到former[n]中
17 //遍历,计算出第x天之后的一次交易可以得到的最大效益,存储在latter[n]中
18 //遍历,计算former[i] +latter[i] 得到最大效益max
19 int prices[Maxlen];//存储每天的股票价值
20 int i,j,k,n;//n代表的是给定的天数
21 while(~scanf("%d",&n)){
22 for(i=0;i<n;i++)
23 scanf("%d",&prices[i]);
24 int former[Maxlen];//第n天前的一次交易的最大收益
25 int latter[Maxlen];//第n天后的一次交易的最大效益
26 int MinPrice=INF;
27 int MaxPrice=_INF;
28 int Maxans=0;
29 //分别通过遍历求解former和latter数组
30 for(i=0;i<n;i++){
31 MinPrice=min(MinPrice,prices[i]);
32 Maxans=max(Maxans,prices[i]-MinPrice);
33 former[i]=Maxans;
34 }
35 //其中Minprice代表的是n天之前的股票价格的最小值
36 //其中maxans代表的是n天之前当时的最大收益
37 Maxans=0;
38 for(i=n-1;i>=0;i--){
39 MaxPrice=max(MaxPrice,prices[i]);
40 Maxans=max(Maxans,MaxPrice-prices[i]);
41 latter[i]=Maxans;
42 }
43 Maxans=0;
44 for(i=0;i<n;i++)
45 Maxans=max(Maxans,former[i]+latter[i]);
46 printf("%d\n",Maxans);
47 }
48 return 0;
49 }