Lintcode 买卖股票的最佳时机 II

连接:http://www.lintcode.com/zh-cn/problem/best-time-to-buy-and-sell-stock-ii/

 

假设有一个数组,它的第i个元素是一个给定的股票在第i天的价格。设计一个算法来找到最大的利润。你可以完成尽可能多的交易(多次买卖股票)。然而,你不能同时参与多个交易(你必须在再次购买前出售股票)。

 

这一题很容易想到一个n方的dp,dp[i]表示前i天能得到的最大值, cost[i]表示价值。

如果第i个不卖出去,dp[i]=dp[i-1]  (1)

如果第i个卖出去,dp[i]=max(dp[i], dp[k]+cost[i]-cost[k]),0<=k<i;(2)

这样虽然能得到正确的答案,但是会超时!!!!

以上的关键是(2)式比较耗时,我们可以优化下。

首先第i个卖出去的时候

1)这个票是从i-1买进来的,这个时候cost[i-1]一定要小于cost[i],否则这种情况不存在。

2)这个票是从i-1以前买进来的,设为第k天,这样的是有条件的,那就是cost[k+1]到cost[i-1]都介于cost[k]与cost[i]之间。否则取另外的就会有更优的解法。

从cost[k]买进来cost[i]卖出去,等价为cost[k]买进来cost[i-1]卖出去,然后再从cost[i-1]买进来cost[i]卖出去,cost[i]-cost[i-1]是个定值,所以就是直接考虑前i-1,

所以(2)式直接改成dp[i]=max(dp[i], dp[i-1]+cost[i]-cost[i-1]),就是直接考虑第i-1个就好了;所以就可以在O(n)时间复杂度内解决了。

 

AC代码:
 

 

class Solution {
public:
    /**
     * @param prices: Given an integer array
     * @return: Maximum profit
     */
    int maxProfit(vector<int> &prices) {
        int Size=prices.size();
        int dp[Size+10];
        int c[Size+10];
        for(int i = 1; i <= Size; i++){  
            c[i]=prices[i-1];
        }  
        dp[1]=0;
        for(int i=2; i<=Size; i++){
            dp[i]=dp[i-1];
            if(c[i]>c[i-1]){
                if(c[i]-c[i-1]+dp[i-1])
                dp[i]=c[i]-c[i-1]+dp[i-1];
            }
        }
        if(Size==0)return 0;
        return dp[Size];
    }
};

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值