Best Time to Buy and Sell Stock IV

来源:互联网 发布:阿房宫读音知乎 编辑:程序博客网 时间:2024/06/05 19:47

Say you have an array for which the ith element is the price of a given stock on day i.

Design an algorithm to find the maximum profit. You may complete at most k transactions.

解题思路

采用动态规划来解决问题。 
我们需要维护如下两个量: 
global[i][j]:当前到达第i天最多可以进行j次交易,所得到的最大利润。 
local[i][j]:当前到达第i天最多可以进行j次交易,而且最后一次交易在当天卖出,所得到的最大利润。 
状态转移方程: 
global[i][j] = max(local[i][j], global[i-1][j]) 
上述方程比较两个量的大小:①当前局部最大值;②过往全局最大值。 
local[i][j] = max(global[i-1][j-1] + max(diff, 0), local[i-1][j] + diff) 
上述方程比较两个量的大小: 
①全局到i-1天进行j-1次交易,然后加上今天的交易(如果今天的交易赚钱的话)。 
②取局部第i-1天进行j次交易,然后加上今天的差值(local[i-1][j]是第i-1天卖出的交易,它加上diff后变成第i天卖出,并不会增加交易次数。无论diff是正还是负都要加上,否则就不满足local[i][j]必须在最后一天卖出的条件了)

另外需要注意的一个问题是,当k远大于数组的大小时,上述算法将变得低效。因此将其改用不限交易次数的方式解决。

public class Solution {
    public int maxProfit(int k, int[] prices) {
        int len = prices.length;
        if (len == 0)
        {
            return 0;
        }
        if (k >= len)
        {
            return helper(prices);
        }


        int[] max_local = new int[k+1];
        int[] max_global = new int[k+1];
        int diff = 0;
        for (int i = 0; i < len - 1; i++)
        {
            diff = prices[i + 1] - prices[i];
            for (int j = k; j >= 1; j--)
            {
                max_local[j] = Math.max(max_global[j - 1] + Math.max(diff, 0), max_local[j] + diff);
                max_global[j] = Math.max(max_local[j], max_global[j]);
            }
        }


        return max_global[k];
    }


    int helper(int[] prices)
    {
        int profit = 0;
        for (int i = 0; i < prices.length - 1; i++)
        {
            profit = Math.max(profit, profit + prices[i + 1] - prices[i]);
        }


        return profit;
    }
}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 去韩国干服务员不会讲韩语怎么办 华为手机键盘变英文字母大了怎么办 淘宝申请售后卖家余额不足怎么办 发票名称少写了一个字怎么办 微博数量与实际数量不一致怎么办 在淘宝中要买的商品卖完了怎么办 病因写错了保险不报销怎么办? 上学期间保险名字写错了怎么办 塑料盆上的商标纸撕了胶怎么办 川航买机票名字错了两个字怎么办 买机票护照号码填错了怎么办 换旅行证给孩子改名字怎么办 浦发信用卡卡片名字印错了怎么办 公主工作很辛苦坚持不下去怎么办 在表格里怎么办名字转换成拼音 激素脸有黑头毛孔大该怎么办 兢兢业业上班但不招领导喜欢怎么办 身体长的还算苗条但就屁股大怎么办 我想学英语从基础开始要怎么办 政府单位领导给我调岗我该怎么办 领导在单位想捞钱我该怎么办 单位领导是宵小之人我该怎么办 一件事想不明白非得想明白怎么办 在四楼上课时发生地震该怎么办 媳妇要离婚我想要孩子该怎么办 媳妇带了避孕环我想要孩子怎么办 新开的文具店一点生意都没有怎么办 孩子在学校被坏孩子欺负了该怎么办 老师像个傻叉我妈还喷我我怎么办啊 承台上预埋桥墩连接钢筋错了怎么办 冲床油缸螺栓拆不下来怎么办 汇款到账银行写错了怎么办 搜狗输入法数字序号超过20怎么办 苹果手机保存的图片变模糊怎么办 微信视频保存到手机变模糊怎么办 自己的位置被别人取代了怎么办 给工厂做半成品老板跑了怎么办 微信变成英文再恢复汉字怎么办 cad中标注尺寸数字太小怎么办 扣扣的钱包手势密码忘记了怎么办 台式电脑带符号的数字打不出怎么办