一、题目表示
给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 ;非负整数 fee 代表了交易股票的手续费用。
你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。
返回获得利润的最大值。
注意:这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。
二、解题思路
本题采用的是动态规划来进行解题,动态规划的基本步骤:
(1)确定状态:研究最优策略的最后一步,化为子问题
(2)转移方程:根据子问题定义得到
(3)初始化条件、边界问题
(4)计算顺序
本题:
三、测试代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void printvc(vector<int> &arr)
{
for(auto x:arr){
cout<<x<<" ";
}
return;
}
int maxProfit(vector<int>& prices,int fee)
{
int n=prices.size();
vector<vector<int> > dp(n,vector<int>(2));
dp[0][0]=0;//表示第0天交易后手里没有股票的最大利润,//卖
dp[0][1]=-prices[0];//表示第i天交易完后手里持有一支股票的最大利润 买
for(int i=1;i<n;i++){
dp[i][0]=max(dp[i-1][0],dp[i-1][1]+prices[i]-fee);
dp[i][1]=max(dp[i-1][1],dp[i-1][0]-prices[i]);
}
return dp[n-1][0];
}
int main()
{
int n,fee;
cin>>n>>fee;
vector<int> princes(n);
for(int i=0;i<n;i++){
cin>>princes[i];
}
int res=maxProfit(princes,fee);
cout<<res<<endl;
return 0;
}