核心思想是:第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;
}

京公网安备 11010502036488号