You are given an array prices where prices[i] is the price of a given stock on the ith day.
Find the maximum profit you can achieve. You may complete as many transactions as you like (i.e., buy one and sell one share of the stock multiple times).
Note: You may not engage in multiple transactions simultaneously (i.e., you must sell the stock before you buy again).
思路
本题假如规定只能进行一次买卖的话,那就是典型的动态规划问题了,具体作法详见买卖股票的最佳时机I
但是本题允许多次购买,那就不难想到可以采用贪心的方法。当前价格小于后一个价格,又满足卖出不会亏损时,就可以将其卖掉。
需要注意的是,卖出股票后,dp数组应更新为当前的股票价格。
考虑到边界问题,需要将prices数组添加一个末尾0,使得遍历最后一个股票价格时,i+1不会超出容器边界。
状态转移方程
dp[i] = min(dp[i-1], prices[i])
边界条件
dp[0] = prices[0]
代码
class Solution {
public:
int maxProfit(vector<int>& prices) {
int dp[30005] = {0};
dp[0] = prices[0];
int sum = 0;
prices.push_back(0);
int len = prices.size();
for(int i = 1; i < len-1; i++)
{
dp[i] = min(dp[i-1], prices[i]);
if(prices[i] > prices[i+1] && prices[i] > dp[i-1])
{
sum += prices[i] - dp[i-1];
dp[i] = prices[i];
}
}
return sum;
}
};