核心思想是:第N天的最大收益第N天市值减去前N天市值的最小值,从j=n-1开始一直往回推,同时可以用a[j]村粗第J天的最大收益,还有其他细节自己也要考虑(N=0或1)

#include <stdio.h>
int Min(int a[],int n);
int main() {
    int n,max=0,mi=0;
    scanf("%d",&n);
    int a[n],Min[n];
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);//读入数组
        if(i==0)//Min初始化
        {
            Min[i]=a[i];//Min[i]存储前i个数的最小值
        }
        else
        {
            if(a[i]<Min[i-1]){//如果a[i]是前N个数的最小值
                Min[i]=a[i];//则更新Min[i]
            }
            else
            {
                Min[i]=Min[i-1];//如果不是则前i个数的最小值不变
            }
        }
    }
    if(n<=1)//对只有一个数和只有两个数要单独考虑
    {
        printf("%d",0);
        return 0;
    }
  else  if(n==2)
    {
        if(a[1]-a[0]>0)
        {
            printf("%d",a[1]-a[0]);
        }
        else
        {
            printf("0");
        }
    }
   else{
    for(int j=n-1;j>1;j--)//核心思想
    {
        a[j]=a[j]-Min[j-1];//第J天的最大收益为第J天的市值减去前J-1天的最小市值即为最大收益
    }
    for(int k=2;k<n;k++ )
    {
        if(a[k]>max)//遍历第k天的最大收益数组,找出最大值
        {
            max=a[k];
        }
    }
    printf("%d",max);
   }
    return 0;
}