Openjudge2.6基本算法之动态规划8464:股票买卖
题目传送门
刚开始看书上的代码还是挺懵逼的……两次循环处理分别是求从0到第i天获得的最大利润和从第i天到第n天获得的最大利润,然后从1到n找出两者相加的最大值即可。
注意:cin,cout会超时!!!所以要用黑科技!!!(或scanf,printf)
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=100100;
int t,n,ans,price[maxn],mmin[maxn],mmax[maxn],li[maxn],ri[maxn];
int main()
{
ios::sync_with_stdio(false);
cin>>t;
while(t--)
{
cin>>n;
for(int i=1;i<=n;i++) cin>>price[i];
mmin[1]=price[1],li[1]=0;
for(int i=2;i<=n;i++)
{
mmin[i]=min(mmin[i-1],price[i]);
li[i]=max(li[i-1],price[i]-mmin[i]);
}
mmax[n]=price[n],ri[n]=0;
for(int i=n-1;i>=1;i--)
{
mmax[i]=max(mmax[i+1],price[i]);
ri[i]=max(ri[i+1],mmax[i]-price[i]);
}
ans=0;
for(int i=1;i<=n;i++) ans=max(ans,ri[i]+li[i]);
cout<<ans<<endl;
}
return 0;
}