- 动态规划问题
-
观察
假设我们拥有了股票,我们在第n天出售股票,得到的利润为销售金额减去收购金额,且收购金额比出售金额少才行。要使得金额最大,那么我们应当拿今天的出售金额减去之前收购金额最少的才行。我们不妨设置dp[i]数组,下标表示在第i天,dp[i]的值表示直到第i天,收购金额最少的数目(通俗来讲就是包括i天和i天前你可以收购的最小金额)。
-
状态方程
由观察得知,目前可收购最小金额为昨天收购最小金额与今天的金额的最小值,
dp[i] = min{dp[i-1],prices[i]}
-
边界情况
由i-1>=0知,我们从下标1开始遍历,dp[0]要初始化。这里的0代表第一天,由于第一天没有前一天,那么当前可收购的最小值一定是它本身了。
dp[0]=prices[0]
-
最终结果
我们最终是返回最大利润,我们可以设置变量max用来存储当前最大值,它的值等于prices[i]-dp[i-1](第i天的销售价格-前i天最小购买股票的金额)。
注意:当max不能小于0,如果最终没有利润,只能返回零,中途判断max时也不能将它赋值为0。
具体代码如下
int maxProfit(int* prices, int pricesSize){
int dp[pricesSize],max=0,i;//置max为零,就不用担心出现比max比0小的情况了
dp[0]=prices[0];
for(i=1;i<pricesSize;i++)
{
if(max<prices[i]-dp[i-1])
max=prices[i]-dp[i-1];
if(prices[i]<dp[i-1])
{
dp[i]=prices[i];
}
else
{
dp[i]=dp[i-1];
}
}
return max;
}