题目:股票买卖
思路:
可能是这个题(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;
}