确定状态 pro [ i ]表示从第一天到第 i 天能获得的最大利润 post[ i ]表示从第 i 天到第 n 天能获得的最大利润
状态转移方程
pro [ i ] = max( pro[ i-1 ],price[ i ] - min )
post [ i ] = max( post[ i+1 ] , max - price[ i ] )
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <string>
#include <map>
#include <set>
#include <queue>
#include <string.h>
#include <math.h>
#include <stack>
#include <ctype.h>
using namespace std;
int T;
int n;
int price[100005];
int pro[100005];
int post[100005];
int minp;
int maxp;
int main()
{
scanf("%d", &T);
while( T-- )
{
memset( price, 0, sizeof(price) );
memset( pro, 0, sizeof(pro) );
memset( post, 0, sizeof(post) );
scanf("%d", &n);
for( int i = 0; i < n; i++ )
scanf("%d", &price[i]);
minp = price[0];
pro[0] = 0;
for( int i = 1; i < n; i++ )
{
minp = min( minp, price[i] );
pro[i] = max( pro[i-1], price[i] - minp );
}
maxp = price[n-1];
post[n-1] = 0;
for( int i = n-2; i >= 0; i-- )
{
maxp = max( maxp, price[i] );
post[i] = max( post[i+1], maxp - price[i] );
}
int ans = -1;
for( int i = 0; i < n; i++)
ans = max(ans, post[i] + pro[i]);
printf("%d\n",ans);
}
return 0;
}