博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[DP解题] 买卖股票的最佳时间问题之四
阅读量:4041 次
发布时间:2019-05-24

本文共 2490 字,大约阅读时间需要 8 分钟。

[DP解题] 买卖股票的最佳时间问题之四

原题链接:

Say you have an array for which the i-th 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.

Note:

You may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).

Example 1:

Input: [2,4,1], k = 2

Output: 2
Explanation: Buy on day 1 (price = 2) and sell on day 2 (price = 4), profit = 4-2 = 2.
Example 2:

Input: [3,2,6,5,0,3], k = 2

Output: 7
Explanation: Buy on day 2 (price = 2) and sell on day 3 (price = 6), profit = 6-2 = 4.
             Then buy on day 5 (price = 0) and sell on day 6 (price = 3), profit = 3-0 = 3.

 

算法设计

package com.bean.algorithm.dp;public class BestTimeBuyAndSellStockIV {	public int maxProfit(int k, int[] prices) {        if (prices == null || prices.length <= 1 || k <= 0) {            return 0;        }        // a simple case: when k >= n/2, it allows transactions as many as possible        if (k >= (prices.length >> 1)) {            return quickSolve(prices);        }        final int n = prices.length;        int[][] profits = new int[k + 1][n];        for (int i = 1; i <= k; i ++) {            int minCost = prices[0];            /**             * when j = 1, minCost = prices[0] for the ith transaction             * when j = 2, minCost = prices[0]             * when j = 3, minCost = min(prices[0], prices[2] - profits[i - 1][1])             *             */            for (int j = 1; j < n; j ++) {                // the maximum profit we can get at day #j                profits[i][j] = Math.max(profits[i][j - 1], prices[j] - minCost);                // the minimum cost for the next transaction                // buy a stock at day #j, price is prices[j] and                 // we already held a maximum profit of profits[i - 1][j - 1]                minCost = Math.min(minCost, prices[j] - profits[i - 1][j - 1]);            }        }        return profits[k][n - 1];    }		private int quickSolve(int[] prices) {        int maxProfit = 0;        for (int i = 1; i < prices.length; i ++) {            maxProfit += Math.max(prices[i] - prices[i - 1], 0);        }        return maxProfit;    }	public static void main(String[] args) {		// TODO Auto-generated method stub				BestTimeBuyAndSellStockIV stock = new BestTimeBuyAndSellStockIV();				int[] demo = new int[] { 3,2,6,5,0,3 };		int k=2;				int result = stock.maxProfit(k,demo);		System.out.println("result = " + result);	}}

运行结果:

result = 7

 

转载地址:http://vdtdi.baihongyu.com/

你可能感兴趣的文章
12.2: ORA-28040 Followed by ORA-1017 When Client is Under Version 12
查看>>
ORA-01031 TOAD 连接到12c数据库
查看>>
Docker-利用Dockerfile来搭建tomcat服务
查看>>
Docker跨服务器迁移
查看>>
VMware安装centos虚拟机 通过NAT与主机互通并能上网
查看>>
expdp/impdp 数据库迁移详细过程
查看>>
oracle 误删除表的几种恢复方法
查看>>
hadoop、hbase、hive、spark分布式系统架构详细搭建过程
查看>>
Hadoop与Hbase各版本对应关系
查看>>
impdp时ORA-39126: Worker unexpected fatal error in KUPW$WORKER.PUT_DDLS [TABLE_STATISTICS]
查看>>
OracleMTSRecoveryService 启动失败
查看>>
oracle job如何定时执行带参数的存储过程
查看>>
oracle12c存在pdb情况下的data guard 详细搭建
查看>>
oracle 查询自动补全日期以及相应的数据
查看>>
Centos7.4 zabbix3.4.8源码安装详细过程
查看>>
python 自动抓取网页新闻以及图片并存储到数据库中
查看>>
python监控系统(flask+python+html)
查看>>
oracle从备份集中恢复归档日志方法
查看>>
Oracle跨版本与跨平台执行传输表空间(XTTS)
查看>>
fatal: unable to access 'https://github.com/danfengcao/binlog2sql.git/': SSL connect error
查看>>