LeetCode-买股票最佳时(动态规划)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gu9tfdzt-1649689211537)(C:\Users\sky\AppData\Roaming\Typora\typora-user-images\image-20220411222428229.png)]

  • 动态规划问题
  1. 观察

    假设我们拥有了股票,我们在第n天出售股票,得到的利润为销售金额减去收购金额,且收购金额比出售金额少才行。要使得金额最大,那么我们应当拿今天的出售金额减去之前收购金额最少的才行。我们不妨设置dp[i]数组,下标表示在第i天,dp[i]的值表示直到第i天,收购金额最少的数目(通俗来讲就是包括i天和i天前你可以收购的最小金额)。

  2. 状态方程

    由观察得知,目前可收购最小金额为昨天收购最小金额与今天的金额的最小值,

    dp[i] = min{dp[i-1],prices[i]}

  3. 边界情况

    由i-1>=0知,我们从下标1开始遍历,dp[0]要初始化。这里的0代表第一天,由于第一天没有前一天,那么当前可收购的最小值一定是它本身了。

    dp[0]=prices[0]

  4. 最终结果

    我们最终是返回最大利润,我们可以设置变量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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值