OpenJudge(4121)(股票买卖)

链接:https://vjudge.net/problem/OpenJ_Bailian-4121
思路:题目的意思可以囊括为,从序列中取出四个数a1,a2,a3,a4,要求a4-a3+a2-a1的值最大。后一个数的下标大于等于前一个数,也就是可以选同一个数。不妨用a2,a3之间某个数(也可能是a2,a3本身)来描述状态,前一部分选两个数相减的最大值还有后面两个数的最大值,所以可以考虑从前面来一次dp再从后面来一次dp,最后取一个前面+后面的最大值。
代码:

#include
#include
#include
using namespace std;

const int maxn = 1e5+1;
int t,n,a[maxn];
int dp1[maxn],dp2[maxn];

int main(){
    scanf("%d",&t);
    while(t--){
        memset(dp1,0,sizeof(dp1));//某个点前面两个数相减的最大值
        memset(dp2,0,sizeof(dp2));//某个点后面两个数相减的最大值
        scanf("%d",&n);
        for(int i=0;i=0;j--){
            dp2[j] = max(dp2[j+1],tail-a[j]);
            tail = max(tail,a[j]);//更新后j个数中的最大值
        }
        int ans = 0;
        for(int i=0;i

你可能感兴趣的:(OpenJudge(4121)(股票买卖))