动态规划:求全局最优解:确认原问题与子问题,动态规划状态,状态转移方程,边界状态结值。

子问题:找到最终卖的收益最大值,或者max(最后的静默,最后的卖)

状态:买、卖的最大收益,第i次买、卖的最大收益 。

转化:sell=buy+a;buy=sell-a/-a

  1. 股票交易-最多进行一次,无冷却期,手里最多一只股票
  2. 股票交易-最多K次交易
  3. 股票交易-1天的冷却期
  4. 股票交易-需要交易费用
  5. 股票交易-最多交易两次
  6. 股票交易-条件很多

1. 最多进行一次

交易之后必须第二天才能在进行交易。如果在第i天卖出股票,则在[0-i-1]的一天中找到最小的买入价买入。

第i天的最大收益=max(历史最大收益,第i天进行交易后的收益)

public static int makeStoke(int[] A){if (A==null||A.length==0){return 0;}int maxM=-A[0];int pre=Integer.MAX_VALUE;for (int i = 1; i < A.length; i++) {pre=Math.min(pre,A[i-1]);maxM=Math.max(maxM,A[i]-pre);}return maxM;}

2. 最多K次交易

考虑第i天交易股票,那么找到[0,i-1]买股票,此次最大收益为max(这次不交易,第j天的收益+i天卖股票的钱-j天买股票的钱)

public static int maxProfit(int k, int[] prices) {/**当k大于等于数组长度一半时, 问题退化为贪心问题此时采用 买卖股票的最佳时机 II的贪心方法解决可以大幅提升时间性能, 对于其他的k, 可以采用 买卖股票的最佳时机 III的方法来解决, 在III中定义了两次买入和卖出时最大收益的变量, 在这里就是k租这样的变量, 即问题IV是对问题III的推广, t[i][0]和t[i][1]分别表示第i比交易买入和卖出时各自的最大收益**/if(k < 1) return 0;if(k >= prices.length/2) return greedy(prices);int[][] t = new int[k][2];for(int i = 0; i < k; ++i)t[i][0] = Integer.MIN_VALUE;for(int p : prices) {t[0][0] = Math.max(t[0][0], -p);t[0][1] = Math.max(t[0][1], t[0][0] + p);for(int i = 1; i < k; ++i) {t[i][0] = Math.max(t[i][0], t[i-1][1] - p);t[i][1] = Math.max(t[i][1], t[i][0] + p);}}return t[k-1][1];}private static int greedy(int[] prices) {int max = 0;for(int i = 1; i < prices.length; ++i) {if(prices[i] > prices[i-1])max += prices[i] - prices[i-1];}return max;}

3. 1天的冷却期     leetcode309

建立状态机,静默,buy,sell

详情:https://www.cnblogs.com/jdneo/p/5228004.html

 if (A == null || n <= 0) {return 0;}int[] S = new int[n];int[] buy = new int[n];int[] sell = new int[n];buy[0] = -A[0];for (int i = 1; i < n; i++) {S[i] = Math.max(S[i - 1], sell[i - 1]);buy[i] = Math.max(buy[i - 1], S[i - 1] - A[i]);sell[i] = buy[i] + A[i];}return Math.max(S[n - 1], sell[n - 1]);

4. 需要交易费用

//dp1[i]-第i天手里没有股票的最大收益: max(昨天手里没有股票,昨天有今天卖了)
//dp2[i]-第i天手里有股票的最大收益:max(昨天有,昨天没有今天买了)public static int makeStoke(int[] prices,int fee) {if (prices == null || prices.length == 0) {return 0;}int n = prices.length;int[] dp1=new int[n];int[] dp2=new int[n];dp2[0]=-prices[0];for (int i = 1; i < n; i++) {dp1[i]=Math.max(dp1[i-1],dp2[i-1]+prices[i]-fee);dp2[i]=Math.max(dp2[i-1],dp1[i-1]-prices[i]);}return dp1[n-1];}

5. 最多交易两次

//最多交易;两次    O(n) O(n)public static int makeStokeK3(int[] A) {if (A == null || A.length == 0) {return 0;}int n = A.length;int[] firstBuy = new int[n];int[] firstSell = new int[n];int[] secondBuy = new int[n];int[] secondSell = new int[n];firstBuy[0]=-A[0];secondBuy[0]=-A[0];for (int i = 1; i < n; ++i) {firstBuy[i] =Math.max(firstBuy[i-1], -A[i]);firstSell[i]=Math.max(firstSell[i-1],firstBuy[i-1]+A[i]);secondBuy[i]=Math.max(secondBuy[i-1],firstSell[i-1]-A[i]);secondSell[i]=Math.max(secondSell[i-1],secondBuy[i-1]+A[i]);}return secondSell[n-1];}//最多交易;两次    O(n) O(1)
//    想要最后secondsell最大->secondbuy最大->firstBuy最大->firstBuy最大//若buy定住,则sell=buy+a(更大,重卖);若buy=sell-a/-a,更小则重买。买卖都是累计值public static int makeStokeK4(int[] A) {if (A == null || A.length == 0) {return 0;}int n = A.length;int firstBuy=Integer.MIN_VALUE,firstSell=0;int secondBuy=Integer.MIN_VALUE,secondSell=0;for (int a:A) {if (firstBuy<-a){firstBuy=-a;}if (firstSell<firstBuy+a){firstSell=firstBuy+a;}if (secondBuy<firstSell-a){secondBuy=firstSell-a;}if (secondSell<secondBuy+a){secondSell=secondBuy+a;}}return secondSell;}

算法-动态规划-股票交易相关推荐

  1. 计算机算法的发展动态,计算机算法动态规划讲解.ppt

    计算机算法动态规划讲解 * 0-1背包问题 设所给0-1背包问题的子问题 的最优值为m(i,j),即m(i,j)是背包容量为j,可选择物品为i,i+1,-,n时0-1背包问题的最优值.由0-1背包问题 ...

  2. 漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)

    在前两集漫画中,我们通过一个算法问题的完整解题过程,讲述了动态规划的基本概念和思想.没看过前两集的朋友可以点击下面的链接: 漫画说算法–动态规划算法一(绝对通俗易懂,非常棒) 漫画说算法–动态规划算法 ...

  3. 矩阵相乘的strassen算法_矩阵乘法的Strassen算法+动态规划算法(矩阵链相乘和硬币问题)...

    矩阵乘法的Strassen 这个算法就是在矩阵乘法中采用分治法,能够有效的提高算法的效率. 先来看看咱们在高等代数中学的普通矩阵的乘法 两个矩阵相乘 上边这种普通求解方法的复杂度为: O(n3) 也称 ...

  4. 算法-动态规划2图问题-TSP问题

    算法-动态规划2-TSP问题 问题: 旅行家要旅行n个城市,要求各个城市经历且仅经历一次然后回到出发城市,并要求所走的路程最短. 设s, s1, s2, -, sp, s是从s出发的一条路径长度最短的 ...

  5. 算法-动态规划2图问题-多段图的最短路径问题

    算法-动态规划2-多段图的最短路径问题 多段图的最短路径问题 问题:设图G=(V,E)是一个带权有向图,如果把顶点集合V划分成k个互不相交的子集Vi(2<=k<=n,1<=i< ...

  6. 算法-动态规划算法总结

    1 基础问题 // 509. 斐波那契数 // 斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 .该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和.// dp[i]的 ...

  7. 算法 动态规划 01背包问题

    01背包 问题分析 代码实现 从前往后拿,递归实现 非递归实现 非递归实现,自上向下填充 允接上一文章内容: 算法 动态规划: link. 问题分析 按照普通思维,首先想到应该为贪心算法,也就是计算每 ...

  8. Dijkstra 贪心算法 动态规划

    我认为 Dijkstra算法 的本质是 广度优先搜索, 而此处的广度是定义在路程的cost之上的. (就好比从圆心处向外扩散一个圆环,首次碰到的就是最近) 动态规划泛指,重叠子问题与原问题的推算关系( ...

  9. 动态规划法求最大字段和时间复杂度_九章算法 | 动态规划:最长上升子序列

    给定一个整数序列,找到最长上升子序列(LIS),返回LIS的长度. 在线评测地址:LintCode 领扣 说明 最长上升子序列的定义: 最长上升子序列问题是在一个无序的给定序列中找到一个尽可能长的由低 ...

最新文章

  1. asp.net 网页做一个浮动层_你们要的HTML、CSS布局技巧:如何规范搭建网页架构?
  2. 如何把PB程序的数据库从ASA迁移到ASE?
  3. Stata回归结果输出
  4. jupyter notebook多维数组运算_Python创建二维数组的正确姿势
  5. Android 教程
  6. 飞鱼科技游戏开发岗面试经验
  7. Flask入门系列(转载)
  8. 【转】刨根究底字符编码之五——简体汉字编码方案(GB2312、GBK等)以及全角、半角、CJK
  9. Java自动计算迷宫正确路线算法源码
  10. UIImagePickerController
  11. AI2019下载Adobe Illustrator CC2019安装教程
  12. EventBus源码解析 1
  13. 视频怎么制作动图?教你一招视频gif制作的方法
  14. python2个子线程等待_Python的并发并行[1] - 线程[3] - 多线程的同步控制
  15. 梦想还是要有的,万一实现了呢?
  16. 橘子学ES19之词项搜索全文检索
  17. Linux基础命令之tar解压缩详解
  18. go语言实战(猜数字+在线词典+服务器)
  19. 2022-kaggle-nlp赛事:Feedback Prize - English Language Learning
  20. 测试工程师小工具分享

热门文章

  1. MT4_应用于外汇交易的量化模型
  2. android (拼图游戏)数字推盘的简单实现
  3. win7x64新进程画面均无显示一例分析——从内核态到用户态,从x64到wow64,从汇编到托管
  4. Flink(十一):Parallelism 、Slot 简介
  5. 名编辑电子杂志大师教程 | 链接打开设置
  6. 若g(x,u,w)为凸,则p(u,w)=inf{x} g(x,u,w)为凸
  7. AE按行政区范围加载图层数据(转载)
  8. EXCEL 时间按秒递增或递减
  9. 西门子PLC200smart学习浅谈
  10. 【Javaee毕业设计】基于JAVA_JSP电子书下载系统