OpenJudge 8464 股票买卖

题目:股票买卖


思路:

可能是这个题(UVA 11078)的升级版……

就是正反跑两次这个算法,再求最大值。


代码:

#include<bits/stdc++.h>
using namespace std;

#define inf (1<<30)
#define maxn 100000

int n;
int a[maxn+5];
int f[maxn+5],g[maxn+5];

int dp(){
	int Min=inf,Max=-inf;
	for(int i=1;i<=n;i++){
		Min=min(a[i],Min);
		f[i]=max(f[i-1],a[i]-Min);
	}
	for(int i=n;i>=1;i--){
		Max=max(a[i],Max);
		g[i]=max(g[i+1],Max-a[i]);
	}
	int s=0;
	for(int i=1;i<=n;i++){
		s=max(s,f[i]+g[i]);
//		printf("%d   %d %d\n",i,f[i],g[i]);
	}
	return s;
}

int main() {
	int T;
	scanf("%d",&T);
	while(T--){
		scanf("%d",&n);
		for(int i=1;i<=n;i++){
			scanf("%d",&a[i]);
		}
		
		memset(f,0,sizeof(f));
		memset(g,0,sizeof(g));
		int ans=dp();
		printf("%d\n",ans);
	}
	return 0;
}


猜你喜欢

转载自blog.csdn.net/rabbit_ZAR/article/details/80859198
今日推荐