木板最优切割利润最大_最多进行K笔交易的股票最大买卖利润

木板最优切割利润最大

This is a very popular interview problem to find maximum profit in stock buying and selling with at most K transactions. This problem has been featured in the interview rounds of Amazon.

这是一个非常受欢迎的面试问题,目的是在最多进行K笔交易时,在股票买卖中获得最大利润 。 亚马逊的采访回合中已经提到了这个问题。

Problem statement:

问题陈述:

In stock market, a person buys a stock and sells it on some future date. Given the stock prices of N days in form of an array Amount and a positive integer K, find out the maximum profit a person can make in at most K transactions. A transaction is buying the stock on some day and selling the stock at some other future day and new transaction can start only when the previous transaction has been completed.

在股票市场中,一个人购买股票并在将来的某个日期将其出售。 给定N天的股票价格( 数量为数组)和正整数K ,找出一个人最多可以进行K笔交易的最大利润。 某笔交易在某天买入股票,而在将来的另一天卖出股票,只有在上一笔交易完成后才能开始新交易。

    Input:
K=3
N=7
Stock prices on N days:
10 25 38 40 45 5 58
Output:
88

Example:

例:

    Number of maximum transactions: 3
Total number of days, N: 7
To achieve maximum profit:
Stock bought at day1    (-10)
Stock sold at day5      (+45)
Stock bought at day6    (-5)
Stock sold at day7      (+58)
Total profit = 88
Total transactions made = 2

Explanation:

说明:

Let there are N number of days for transactions, say x1, x2, ..., xn

设交易的天数为N ,例如x 1 ,x 2 ,...,x n

Now for any day xi

现在任何一天x

  1. Don't do any transaction on the day xi

    x 当天不做任何交易

  2. Transact on day xi, i.e., buy stock on some day xj and sell on day xi where j<i and i,j Є N

    一天的Transact X I,即,在某些天×j和卖出日股购买X I其中j <iI,JЄñ

Total number of transactions can be made at most = K

最多可以进行的交易总数= K

Now we can formulate the maximum profit case using above two condition.

现在,我们可以使用以上两个条件来制定最大获利情况。

Let,

让,

    f(t,i)=maximum profit upto ith day and t transactions

Considering the above two facts about xi

考虑关于x i的上述两个事实

    f(t,i)=f(t,i-1)  if there is no transaction made on day xi ...(1)
Max(f(t-1,j)+amount[i]-amount[j])       
where j<i and i,j Є N if there is transaction  on day xi ...(2)
Obviously, to maximize the profit we would take the maximum of (1)  and (2)
Number of maximum transactions: 3
Total number of days, N: 7
Stock prices on the days are:
10 25 38 40 45 5 58

Below is a part of recursion tree which can show that how many overlapping sub problems there will be.

下面是递归树的一部分,它可以显示将有多少个重叠的子问题。

recusrion tree 1


Figure 1: Partial recursion tree to show overlapping sub-problems

图1:部分递归树显示重叠的子问题

So we need dynamic programming...

所以我们需要动态编程...

Problem Solution

问题方案

Recursive Algorithm:

递归算法:

    Function(t, i): //f(t, i)
If i=0
f(t, i)=0
If t=0
f(t, i)=0
f(t, i)= f(t, i-1); //no transaction on day xi
For j =0: i
Find max(f(t-1,j) + amount(i)- amount(j)
End For
If the maximum found > f(t, i)
update f(t, i)
End IF
Return f(t, i)

Conversion to DP

转换为DP

    For tabulation we need a 2D array, DP[k+1][n] to store f(t,i)
Base case,
for i 0 to k,   DP[i][0]=0 //no profit on 0th day
for i 0 to n-1,   DP[0][j]=0 //no profit on 0 transaction
To fill the higher values,
for t=1 to k
for i =1 to n-1
DP[t][i]=DP[t][i-1]
for j= 0 to i-1 //buying on jth day and selling on ith day   
DP[t][i]=max(DP[t][i],DP[t-1][j]+ amount[i] –amount[j])
End for
End for
End for
Result would be f(k,n) that is value of DP[k][n-1]

Initial DP table

初始DP表

    DP[4][7] //K=3, N=7

DP Table

Try yourself to compute the DP table manually following the above algorithm and find out the result. Take some small example if necessary.

尝试按照上述算法手动计算DP表并找出结果。 如有必要,举一些小例子。

C++ implementation:

C ++实现:

#include <bits/stdc++.h>
using namespace std;
int Max_profit(vector<int> amount, int n, int k)
{
int DP[k + 1][n];
memset(DP, 0, sizeof(DP));
//on 0th day
for (int i = 0; i <= k; i++)
DP[i][0] = 0;
//on 0 transaction made
for (int i = 0; i <= n; i++)
DP[0][i] = 0;
for (int t = 1; t <= k; t++) {
for (int i = 1; i < n; i++) {
DP[t][i] = DP[t][i - 1];
int maxV = INT_MIN;
//buying on jth day and selling on ith day
for (int j = 0; j < i; j++) {
if (maxV < DP[t - 1][j] + amount[i] - amount[j])
maxV = DP[t - 1][j] + amount[i] - amount[j];
}
if (DP[t][i] < maxV)
DP[t][i] = maxV;
}
}
return DP[k][n - 1];
}
int main()
{
int n, item, k;
cout << "Enter maximum no of transactions:\n";
cin >> k;
cout << "Enter number of days\n";
cin >> n;
vector<int> amount;
cout << "Enter stock values on corresponding days\n";
for (int j = 0; j < n; j++) {
scanf("%d", &item);
amount.push_back(item);
}
cout << "Maximum profit that can be achieved: " << Max_profit(amount, n, k) << endl;
return 0;
}

Output

输出量

Enter maximum no of transactions:
3
Enter number of days
7
Enter stock values on corresponding days
10 25 38 40 45 5 58
Maximum profit that can be achieved: 88

翻译自: https://www.includehelp.com/icp/maximum-profit-in-stock-buy-and-sell-with-at-most-k-transaction.aspx

木板最优切割利润最大

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

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

相关文章

[数据库]Oracle和mysql中的分页总结

Mysql中的分页物理分页•在sql查询时&#xff0c;从数据库只检索分页需要的数据•通常不同的数据库有着不同的物理分页语句•mysql物理分页&#xff0c;采用limit关键字•例如&#xff1a;检索11-20条 select * from user limit 10,10 ;* 每次只查询10条记录.当点击下一页的时候…

List 集合去重的 3 种方法

问题由来在实际开发的时候&#xff0c;我们经常会碰到这么一个困难&#xff1a;一个集合容器里面有很多重复的对象&#xff0c;里面的对象没有主键&#xff0c;但是根据业务的需求&#xff0c;实际上我们需要根据条件筛选出没有重复的对象。比较暴力的方法&#xff0c;就是根据…

C语言入门——排序

排序的方法有很多种比较常见的便为&#xff1a;冒泡排序、选择排序、插入排序、快速排序。 今天我们就围绕着四种排序来说&#xff0c;如果有兴趣的话可以去查找一下其他排序。 在排序这方面我们主要讨论&#xff1a; 稳定&#xff1a;如果a原本在b前面&#xff0c;而ab&…

【转】eclipse技巧1

2019独角兽企业重金招聘Python工程师标准>>> 俗话说的好啊&#xff0c;“工于利启事&#xff0c;必先善其器”&#xff0c;如果说你的编程功底是一个枪法的话&#xff0c;那么强大的eclipse就是android战士们最好的武器。 这里&#xff0c;我们来总结eclipse的使用技…

定时任务最简单的3种实现方法(超好用)

这是我的第 86 篇原创文章作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;定时任务在实际的开发中特别常见&#xff0c;比如电商平台 30 分钟后自动取消未支付的订单&#x…

C语言入门基础——Brute-Force算法

Brute-Force算法的基本思想是&#xff1a; 1) 从目标串s 的第一个字符起和模式串t的第一个字符进行比较&#xff0c;若相等&#xff0c;则继续逐个比较后续字符&#xff0c;否则从串s 的第二个字符起再重新和串t进行比较。 2) 依此类推&#xff0c;直至串t 中的每个字符依次和…

为什么劝你放弃Maven?看看Gradle的这些优点就知道了

相信使用Java的同学都用过Maven&#xff0c;这是一个非常经典好用的项目构建工具。但是如果你经常使用Maven&#xff0c;可能会发现Maven有一些地方用的让人不太舒服&#xff1a;Maven的配置文件是XML格式的&#xff0c;假如你的项目依赖的包比较多&#xff0c;那么XML文件就会…

css中的换行符_如何使用CSS防止项目列表中的换行符?

css中的换行符Introduction: 介绍&#xff1a; Dealing with various items in CSS sometimes pose very different problems. The problem could be anything, it could be related to positioning, arrangement, and whatnot, therefore all such kinds of problems require…

Java中的一些坑,汇总篇(2万字)

Photo Drew Farwell 文 | 常意1.前言

6款html5模板下载

http://www.100sucai.com/code/1316.htmlhttp://www.100sucai.com/code/1318.htmlhttp://www.100sucai.com/code/1310.htmlhttp://www.100sucai.com/code/1309.htmlhttp://www.100sucai.com/code/1303.htmlhttp://www.100sucai.com/code/1301.html转载于:https://blog.51cto.co…

高并发系统 3 大利器之缓存

引言随着互联网的高速发展&#xff0c;市面上也出现了越来越多的网站和app。我们判断一个软件是否好用&#xff0c;用户体验就是一个重要的衡量标准。比如说我们经常用的微信&#xff0c;打开一个页面要十几秒&#xff0c;发个语音要几分钟对方才能收到。相信这样的软件大家肯定…

QTimer与事件循环理解

问题分析 最近在使用QT的时候发现了某些问题&#xff0c;查阅资料最后总结一下。我起初是想用QT在界面还在加载时加载一副动画&#xff0c;然后动画下面有加载的滚动条代表时间&#xff0c;由于测试所以界面加载没写很多东西很快就加载完成了。我就想让他加载慢点我看看效果。…

MYSQL 数学运算符问题

背景&#xff1a; 在mysql中 ’stringA stringB 这种类型的操作&#xff0c;在mysql内部会自动转化为两个double 数进行运算。 -------------------------------------------------------------------------------------------------------------------------------- 例子&a…

面试系列第1篇:常见面试题和面试套路有哪些?

作者 | 面哥来源 | Java面试真题解析&#xff08;ID&#xff1a;aimianshi666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;面试是人生中为数不多的改变自身命运的途径之一&#xff0c;当然有效的准备面试也是人生中为数不多的低投入高回报的…

漫话:应用程序被拖慢?罪魁祸首竟然是Log4j!

之前一段时间&#xff0c;为我们发现的一个SaaS应用程序会间歇性地卡顿、变慢&#xff0c;因为很长时间都没有定位到原因&#xff0c;所以解决的办法就只能是重启。这个现象和之前我们遇到的程序变得卡顿不太一样&#xff0c;因为我们发现这个应用程序不仅在高流量期间时会变慢…

面试系列第2篇:回文字符串判断的3种方法!

作者 | 磊哥来源 | Java面试真题解析&#xff08;ID&#xff1a;aimianshi666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;回文字符串判断是面试和笔试中常见的面试题之一&#xff0c;同时也是 LeetCode 中一道经典的面试题&#xff0c;那么…

Activity具体解释(生命周期、以各种方式启动Activity、状态保存,全然退出等)...

一、什么是Activity&#xff1f; 简单的说&#xff1a;Activity就是布满整个窗体或者悬浮于其它窗体上的交互界面。在一个应用程序中通常由多个Activity构成&#xff0c;都会在Manifest.xml中指定一个主的Activity&#xff0c;例如以下设置 <actionandroid:name"androi…

阿里为什么推荐使用LongAdder,而不是volatile?

这是我的第 87 篇原创文章作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;阿里《Java开发手册》最新嵩山版在 8.3 日发布&#xff0c;其中有一段内容引起了老王的注意&#…

当当花160买400的书,确定不囤一波?

天空飘来五个字&#xff0c;快要开学啦快快让路 ║ 今天我要去上学喽新学期我决定一定要努力学习没有新书给我充电怎么行&#xff1f;每次买完新书&#xff0c;感觉都是在开一场私人签售会哈哈哈这感觉真不错当当网自营图书大促>> 每满100减50 <<满200减100满300减…

万字详解Lambda、Stream和日期

作者&#xff1a;虚无境来源&#xff1a;cnblogs.com/xuwujing/p/10145691.html前言本篇主要讲述是Java中JDK1.8的一些语法特性的使用&#xff0c;主要是Lambda、Stream和LocalDate日期的一些使用。Lambda“Lambda 表达式(lambda expression)是一个匿名函数&#xff0c;Lambda表…