23 动态规划解买卖股票的最佳时机含手续费

问题描述:给定一个整数数组prices,其中第i各元素代表了第i填的股票价格;非负整数fee代表了交易股票是的手续费用,你可以无限次的完成交易,但是你眉笔交易都需要付手续费,如果你已经购买了一个股票,在卖出它之前不能再继续购买股票了,返回获得利润的最大值。注意:一次交易是指买入持有并卖出股票的整个过程,你就不能再继续购买股票了。并定义卖股票才可以进行扣费。

动态规划求解:定义动态数组dp[i][0]表示第i天手里没有股票的最大值,此时有两种选择,一种是dp[i-1][1]+prices[i]-2表示在第i天卖出了股票获得了第i天的利润,第二种是不改变,与之前相同dp[i-1],dp[i][1]表示第i天手里有股票的最大值,此时有两种选择dp[i-1][0]-prices[i]或者保持dp[i-1][0]

public int maxProfit(int []prices)
{
int [][]dp=new int[prices.length][2];dp[0][0]=0;
dp[0][1]=-prices[0];
for(int i=0;i<prices.length;i++)
{
dp[i][0]=Math.max(dp[i-1][0],dp[i-1][1]+prices[i]-2);
dp[i][1]=Math.max(dp[i-1][1],dp[i-1][0]-prices[i]);
}
return Math.max(dp[prices.length-1][0],dp[prices.length-1][1]);
}

递归方式求解:对于每一天而言:如果手上持有股票,可以选择卖或者不卖,然后进入下一天中,
如果手上没有股票,则可以选择不买或者买,然后进入下一年中,最后到达最后一天对将利润加入PriorityQueue<Integer> maxheap=new PriorityQueue<>((a,b)->{return b-a;})或者(PriorityQueue<Integer>maxheap=new PriorityQueue<>(Collections.reverseOrder()))最大堆中,最后从最大堆中弹出第一个数字即为最大利润
 

private getMaxProfit(int [] prices,int index,int profit,Boolean ishasone,PriorityQueue<Integer> queue)
{
if(index==prices.length)
{
queue.add(profit);
return;
}
if(ishasone)
{
getMaxProfit(prices,index+1,profit,ishasone);
getMaxProfit(prices,index+1,profit+prices[i]-2,!ishasone);
}else
{
getMaxProfit(prices,index+1,profit-prices[i],!ishasone);
getMaxProfit(prices,index+1,profit,ishasone);
}
}public int GetMaxProfit(int []prices)
{
PriorityQueue<Integer>maxheap=new PriorityQueue<>(Collections.reverseOrder());
getMaxProfit(prices,0,0,false);
return maxheap.peek();
}

知识点总结:最小堆定义PriorityQueue<Integer>minHeap=new PriorityQueue<>();最大堆定义1
PriorityQueue<Integer>maxHeap=new PriorityQueue<>(Collections.reverseOrder());PriorityQueue<Integer>minheap=new PriorityQueue<>((a,b)->{return b-a});最大堆定义3PriorityQueue<Integer>maxHeap=new PriorityQueue<>(new Comparable<Integer>(){
@Override
public int Compare(Integer t1,Integer t2)
{
return t2-t1;
}
});
PriorityQueue增加操作:minHeap.add(),minheap.offer()
PriorityQueue减少操作:minheap.poll(),minheap.remove();会弹出
PriorityQueue查询操作:minheap.peek();

Map知识点:Map<Integer,Integer>map=new HashMap<Integer,Integer>map;
增加:Map.put(key,value);
访问:Map.get(key);
删除;Map.remove(key);
遍历:
 

        for (Integer i : Sites.keySet()) {
            System.out.println("key: " + i + " value: " + Sites.get(i));
        }
        // 返回所有 value 值
        for(String value: Sites.values()) {
          // 输出每一个value
          System.out.print(value + ", ");

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/202428.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入了解 CPU 的型号、代际架构与微架构!

CPU 在整个计算机硬件中、技术体系中都算是最最重要的东西了。在 10 月 16 号的时候&#xff0c;Intel 正式发布了第 14 代的酷睿处理器。但很多同学看不懂这种发布会上发布的各种 CPU 参数。 今天借着这个时机&#xff0c;从 CPU 硬件相关的技术细节切入&#xff0c;来深入地…

基于SSM的物资物流系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

js实现富文本

当涉及到使用 JavaScript 实现富文本时&#xff0c;一种常见的方法是使用一些现成的富文本编辑器库&#xff0c;比如&#xff1a; Quill&#xff1a;一个功能强大、易于集成的富文本编辑器&#xff0c;支持自定义样式和格式&#xff0c;提供丰富的插件和API。 TinyMCE&#xf…

Distilling the Knowledge in a Neural Network(2015.5)(d补)

文章目录 Abstract1 Introduction2 Distillation2.1 Matching logits is a special case of distillation Results 论文链接 Abstract 提高几乎所有机器学习算法性能的一种非常简单的方法是在相同的数据上训练许多不同的模型&#xff0c;然后对它们的预测进行平均[3]。不幸的是…

C++之类和对象(下)

目录 初始化列表 static成员 C11对于非静态成员变量初始化 友元 友元函数 友元类 总结 初始化列表 我们知道&#xff0c;在学习构造函数时&#xff0c;我们知道对象的成员变量的初始化我们是在构造函数函数体内进行初始化的&#xff0c;还有没有其它初始化成员变量的方…

【Linux】telnet命令使用

telnet命令 telnet命令用于使用telnet协议与另一台主机进行通信。如果在没有主机参数的情况下调用telnet&#xff0c;它将进入命令模式&#xff0c;由其提示&#xff08;telnet>&#xff09;指示。在这种模式下&#xff0c;它接受并执行下面列出的命令。如果使用参数调用它…

十年阿里大牛谈软件测试面试的几个建议

首先从准备软件测试工作的简历说起。 如何准备一个好的简历呢&#xff1f; 好的简历要描述出你的技能&#xff0c;经验和特长。不要拿同样的简历去应聘不同的职位&#xff08;每个职位的要求是不同的&#xff09;&#xff0c;稍作修改就可以让你的机会大增。比方说&#xff0…

深入理解强化学习——马尔可夫决策过程:过程控制

分类目录&#xff1a;《深入理解强化学习》总目录 策略评估是指给定马尔可夫决策过程和策略&#xff0c;我们可以估算出价值函数的值。本文将阐述如果我们只有马尔可夫决策过程&#xff0c;我们应该如何寻找最佳的策略&#xff0c;从而得到最佳价值函数&#xff08;Optimal Val…

数字化时代的保镖:实人认证API在身份验证中的角色

前言 随着数字化时代的迅猛发展&#xff0c;个人信息的安全性和隐私保护成为了当今社会中备受关注的话题。在这个背景下&#xff0c;实人认证API崭露头角&#xff0c;成为数字领域中的一项重要技术&#xff0c;为身份验证提供了全新的保障机制。本文将探讨实人认证API在身份验…

本地启动tomcat,打印的日志中中文乱码

修改配置文件 /conf/logging.properties 修改配置项 java.util.logging.ConsoleHandler.encoding 从UTF-8改成GBK

力扣226:翻转二叉树

力扣226&#xff1a;翻转二叉树 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1] 示例 2&#xff1a; 输入&#xff1a;root [2,1,3]…

git submodule 用法

子仓库启蒙 在根目录执行&#xff1a; git submodule add gitgitee.com:liaosp/dcat-admin-basic-interface.git想要子模块指定的分支&#xff1a; git submodule add -b dev <仓库地址> <子模块路径>这样相当于在根目录上添加了 .gitmodules 信息&#xff0c;相…

java内部类详解

文章目录 一、介绍二、为什么要使用内部类三、非静态内部类四、静态内部类五、局部内部类六、匿名内部类七、lambda表达式内部类八、成员重名九、序列化十、如何选择内部类 一、介绍 在java中&#xff0c;我们被允许在编写一个类(外部类OuterClass)时&#xff0c;在其内部再嵌…

如何制定开发计划

如何制定开发计划&#xff0c;很多开发主管跟项目经理在评估开发计划时喜欢把开发叫起来一块评估&#xff0c;结果会发现&#xff0c;三天时间能做好的功能&#xff0c;底下人&#xff08;特别是一些老油条&#xff09;总是会各种理由做不完要五天&#xff0c;其实这是人之常情…

CTF 6

信息收集 话不多说&#xff0c;nmap进行信息收集&#xff01; 存活主机探测 服务版本探测 端口探测 漏洞脚本探测 UDP端口探测 渗透测试 先看看网站的首页&#xff0c;发现了几个用户&#xff1a; 直接先保存下来吧&#xff0c;以防后面会用到。 SQL注入 看到一个read mor…

作高效保密:了解上海迅软DSE四种加密模式在不同场景中的巧妙运用

于企事业单位内部数据存储情况的复杂性&#xff0c;以及不同公司和部门对文件加密的各异需求&#xff0c;单一的加密系统难以满足这种多样化的加密需求。在应对这一挑战的过程中&#xff0c;天锐绿盾提供了四种不同的加密模式&#xff0c;用户可以根据实际情况选择适用的加密模…

《opencv实用探索·十一》opencv之Prewitt算子边缘检测,Roberts算子边缘检测和Sobel算子边缘检测

1、前言 边缘检测&#xff1a; 图像边缘检测是指在图像中寻找灰度、颜色、纹理等变化比较剧烈的区域&#xff0c;它们可能代表着物体之间的边界或物体内部的特征。边缘检测是图像处理中的一项基本操作&#xff0c;可以用于人脸识别、物体识别、图像分割等多个领域。 边缘检测…

C/C++,图算法——布伦特循环检测算法(Brent‘s cycle detection algorithm)的源程序

1 文本格式 // CPP program to implement Brents cycle // detection algorithm to detect cycle in // a linked list. #include <stdio.h> #include <stdlib.h> /* Link list node */ struct Node { int data; struct Node* next; }; /* Th…

导出Excel需要增加一个错误列, 通用类SheetWriteHandler

背景 如题 在业务中经常遇到这样的需求, 上传excel后对数据进行校验, 如果校验不通过, 需要提供excel下载, 并在后面一列提供错误原因. 常见的做法是在导出的方法中, 加一个字段然后在list中, 然后sheet写到返回流中. 但是如果需要统一样式就比较麻烦, 且每次都需要写这么一…

在Vivado 仿真器中搭建UVM验证环境(不需要联合modelsim)

Vivado 集成设计环境支持将通用验证方法学 (UVM) 应用于 Vivado 仿真器。Vivado 提供了预编译的 UVM V1.2 库。 &#xff08;1&#xff09;在 Vivado 2019.2 中创建新 RTL 工程。 &#xff08;2&#xff09;单击“添加目录 (Add Directories)”以将“src”和“verif”目录添加…