#include <iostream> #include<vector> #include<algorithm> using namespace std; int main() { int n; while (cin >> n) { // 注意 while 处理多个 case vector<int>prices(n); for(int i=0;i<n;i++){ cin>>prices[i]; } // int profit=0; // for(int i=0;i<n;i++){ // for(int j=i+1;j<n;j++){ // if(prices[j]>prices[i]){ // profit=max(profit,prices[j]-prices[i]); // } // } // } // cout << profit << endl; //O(n2)超时 //动态规划 //将prices转化为涨跌幅,然后用最大连续和求,这样就是两个O(n)的操作了 vector<int>dis(n+1); dis[0]=0; for(int i=1;i<=n;i++){ dis[i]=prices[i]-prices[i-1]; } vector<int>dp(n,0); int profit=0; for(int i=1;i<n;i++){ dp[i]=max(dp[i-1]+dis[i],dis[i]); profit=max(profit,dp[i]); } cout<<profit<<endl; //贪心算法 //维护一个minprice和一个maxprofit //因为要求后大减前小,后面的利润组合一定是当前prices和新的minprice得到的 // int minprice=prices[0]; // int maxprofit=0; // for(int i=1;i<n;i++){ // if(prices[i]<=minprice){ // minprice=prices[i]; // } // else{ // maxprofit=max(maxprofit,prices[i]-minprice); // } // } // cout<<maxprofit<<endl; } return 0; } // 64 位输出请用 printf("%lld")