题目
读题
求在第i天卖出的最大利润,就需要求出在[0,i-1]天之间的股票价格最小值,并返回两者之间的差值,求这个差值的最大值。
求解返回便变成了左开右闭求前缀最小值的问题。
运用动态规划
设计状态:求第i项之前的最小值就转移到求(第i-1项之前的最小值和第i项之间)的最小值
写出状态方程:premin[i]=min(premin[i-1],prices[i]);
设定初始状态:premin[0]=price[0];
执行状态转移
返回最终解
代码段
int max(int a,int b) //定义一个求最大值的函数
{
return a>b?a:b;
}
int min(int a,int b)
{
return a<b?a:b; //定义一个求最小值的函数
}
void PreMin(int *nums,int n,int *preMin) //定义一个求前缀最小值的函数
{
int i;
for(i=0;i<n;i++)
{
if(i==0){
preMin[0]=nums[0];
}
else{
preMin[i]=min(preMin[i-1],nums[i]);
}
}
}
#define MAXN 100005
int maxProfit(int* prices, int pricesSize){
int preMin[MAXN];
int ant=0; //定义一个存放利润最大值的变量
int i;
PreMin(prices,pricesSize,preMin);
for(i=1;i<pricesSize;i++)
{
ant=max(ant,prices[i]-preMin[i-1]);
}
return ant;
}
执行结果
总结
万变不离其宗,剖析问题的最底层,发现是求前缀最小值问题,运用状态转移求解