股票买卖问题

来源:互联网 发布:java 获取访问者ip 编辑:程序博客网 时间:2024/05/11 11:01

题目详情及解法见http://blog.csdn.net/joylnwang/article/details/7078530

以下对应的是不限制买入卖出次数的情况:

int maxProfit(vector<int> &prices) {        int sum = 0;        for(int i = 1; i < prices.size() ; ++i) {            int delta = prices[i] - prices[i-1];            if(delta > 0 ) {                sum += delta;            }        }        return sum;    }

另外如果限定只可以一次买入卖出,那么问题就转化成一维数组的子数组最大和问题:

int maxProfit(vector<int> &prices) {        int m = 0;        int cur = 0;        for(int i=1; i<prices.size(); i++){            if (cur < 0) cur = 0;            cur += prices[i]-prices[i-1];            m = max(m,cur);        }        return m;    }

如果限定最多可以买入卖出多次,则问题就变成一维数组的多段子数组最大和问题,每段子数组不能重叠。

设数组sum[i][j]表示前i个数的最大j段和,以第i个数结尾。

则有状态转移方程:sum[i][j] = max(max(sum[k][j-1]),sum[i-1][j])+a[i],j-1<=k<=i-1。

为了降低时间复杂度,引入另外一个数组maxsum[i][j],表示前i个数的最大j段和。

因此能得到maxsum[i][j] = max(maxsum[i-1][j], sum[i][j]),代码如下:

int maxProfit(vector<int> &prices) {            const int times = 2;            int sum[times+1] = {0};            int maxsum[times+1] = {0};            for (int i = 1; i < prices.size(); ++i) {                int diff = prices[i] - prices[i-1];                int m = min(i, times);                for (int j = m; j >= 1; --j) {                    sum[j] = max(sum[j], maxsum[j-1]) + diff;                    maxsum[j] = max(maxsum[j], sum[j]);                }            }            return max(maxsum[1], maxsum[2]);        }