Question

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.

For example, given prices = [4,4,6,1,1,4,2,5], and k = 2, return 6.

Answer

用DP解答。

local[i][j] 表示0~i的数,最多j次交易,并且最后一次交易必须包含prices[j](即最后一天必须卖出),收益最大值。

global[i][j] 表示0~i的数,最多j次交易,收益最大值。

diff = prices[i] - prices[i-1] local[i][j] = max(global[i-1][j-1] + max(diff,0),local[i-1][j]+diff) global[i][j] = max(local[i][j], global[i-1][j])

local[i-1][j] + diff 表示第i-1天,买进prices[i-1],第i天卖出。

由于local[i-1][j]表示最后一次交易必须包含prices[i-1],即prices[i-1]必须卖出。所以可以把第i-1天的交易和第i天的交易合并,即成了最多j次交易,最后一天交易必须卖出prices[i]。 global[i-1][j-1] 表示前i-1天,最多j-1次交易。最后一天比较diff,如果diff>0,则第i-1天买进,第i天卖出;如果diff<0,则第i天买进,第i天卖出。

class Solution {
/**
* @param k: An integer
* @param prices: Given an integer array
* @return: Maximum profit
*/
public int maxProfit(int k, int[] prices) {
// write your code here
if (k == 0) {
return 0;
}
if (k >= prices.length / 2) {
int profit = 0;
for (int i = 1; i < prices.length; i++) {
if (prices[i] > prices[i - 1]) {
profit += prices[i] - prices[i - 1];
}
}
return profit;
}
int n = prices.length;
int[][] mustsell = new int[n + 1][n + 1]; // mustSell[i][j] 表示前i天,至多进行j次交易,第i天必须sell的最大获益
int[][] globalbest = new int[n + 1][n + 1]; // globalbest[i][j] 表示前i天,至多进行j次交易,第i天可以不sell的最大获益 mustsell[0][0] = globalbest[0][0] = 0;
for (int i = 1; i <= k; i++) {
mustsell[0][i] = globalbest[0][i] = 0;
} for (int i = 1; i < n; i++) {
int gainorlose = prices[i] - prices[i - 1];
mustsell[i][0] = 0;
for (int j = 1; j <= k; j++) {
mustsell[i][j] = Math.max(globalbest[(i - 1)][j - 1] + gainorlose,
mustsell[(i - 1)][j] + gainorlose);
globalbest[i][j] = Math.max(globalbest[(i - 1)][j], mustsell[i ][j]);
}
}
return globalbest[(n - 1)][k];
}
};

最新文章

  1. WinForm------SplitContainerControl的窗体调用控件方法
  2. static 使用,静态变量
  3. 烂泥:【解决】ubuntu使用远程NFS报错
  4. 学习CSS3BUTTON(二)
  5. 如何在腾讯云上开发一款O2O书签?
  6. careercup-栈与队列 3.2
  7. Examples_06_02(android)DDMS的data文件中没有显示文件。
  8. POJ 2135 Farm Tour (最小费用最大流模板)
  9. 算法战斗:给定一个号码与通配符问号W,问号代表一个随机数字。 给定的整数,得到X,和W它具有相同的长度。 问:多少整数协议W的形式和的比率X大?
  10. webstrom官方的活动模版介绍
  11. [图形学] Chp8 使用双缓存创建帧动画
  12. Java入门(2) —— 变量详解、运算符、定义类和定义方法以及方法的调用
  13. MongoDB-python的API手记
  14. Maven启动Java Web工程,8081和8086端口号被占用
  15. 自己搭建CA颁发证书做https加密网站
  16. AD 10使用技巧---新学习
  17. Xmind破解
  18. React 组件库框架搭建
  19. css3文本和颜色
  20. Javac常量池的解读

热门文章

  1. linux下svn客户端安装及环境配置(转)
  2. Android 面试精华题目总结
  3. Mac搭建Git/GitHub全过程
  4. centos5.5上apache快速安装H264流媒体支持MP4-H264边下边播
  5. 【转】app瘦身
  6. 程序员必备英语.net版(.net菜鸟的成长之路-零基础到精通)
  7. chrome Provisional headers are shown错误提示
  8. 如何分析apache日志[access_log(访问日志)和error_log(错误日志)]
  9. Delphi 做ActiveX的详细过程
  10. 多线程12-CyclicBarrier、CountDownLatch、Exchanger