标签:fee dp2 dp1 int 股票 714 最佳时机 prices leetcode
leetcode-714 买卖股票的最佳时机含手续费
1. 题目
给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 ;非负整数 fee 代表了交易股票的手续费用。你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。返回获得利润的最大值。
2. 思路
这是一道动态规划题目,每天只有两个状态,持有股票,或者不持有股票,因此设计两个数组,dp1和dp2,dp1代表持有股票时的最大利润,dp2代表不持有股票的最大利润,在第i天结束时,假设是持有股票的,则,这一天的利润为max(第一种情况:{前一天持股,今天继续保持},第二种情况:{前一天不持股,购入今天的股票}),则状态转移方程为
dp1[i]=max(dp1[i-1],dp2[i-1]-prices[i])
假设在第i天结束时不持有股票,则这一天的利润为max(第一种情况:{前一天不持股,今天不购入},第二种情况:{前一天持股,今天卖出}),且卖出时收入费用fee,买入时不收取,状态转移方程为
dp2[i]=max(dp2[i-1],dp1[i-1]+prices[i]-fee)
3. code
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
int maxProfit(vector<int>& prices, int fee) {
int dp1[50000] = {0}; //持股
int dp2[50000] = {0}; //不持股
dp1[0] = -prices[0];
int len = prices.size();
for (int i = 1; i < len; i++) {
dp1[i] = dp1[i - 1] > (dp2[i - 1] - prices[i]) ? dp1[i - 1]
: (dp2[i - 1] - prices[i]);
dp2[i] = dp2[i - 1] > (dp1[i - 1] + prices[i] - fee)
? dp2[i - 1]
: (dp1[i - 1] + prices[i] - fee);
//dp1[i-1] + prices[i] - fee
}
return dp1[len - 1];
}
};
int main() {
vector<int> x = {1, 3, 2, 8, 4, 9};
Solution s;
s.maxProfit(x, 2);
return 0;
}
标签:fee,dp2,dp1,int,股票,714,最佳时机,prices,leetcode 来源: https://www.cnblogs.com/iven98/p/15413580.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。