题目连接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/
题目解法
所以代码为:
#include<bits/stdc++.h>
using namespace std;
class Solution {
public:
int maxProfit(vector<int>& prices) {
int len = prices.size();
int dp[len][2][2];
memset(dp, 0, sizeof(dp));
dp[0][0][0] = 0;
dp[0][1][1] = -prices[0];
for(int i=1; i<len; i++){
dp[i][0][0] = 0;
dp[i][1][0] = max(dp[i-1][1][0], dp[i-1][1][1]+prices[i]);
dp[i][1][1] = max(dp[i-1][1][1], dp[i-1][0][0]-prices[i]);
}
return dp[len-1][1][0];
}
};
但是由于dp[i-1][0][0]永远为0,所以三维数组可以简写成一个二维数据
知道为什么可以简写有一个关键点:交易次数
由于本题中K要么是0,要么是1。0表示没有进行过交易,1表示进行过交易。那么当持有股票的时候,要么是上一次持有股票,要么是第一次持有股票。
代码:
#include<bits/stdc++.h>
using namespace std;
class Solution {
public:
int maxProfit(vector<int>& prices) {
int len = prices.size();
int dp[len][2];
memset(dp, 0, sizeof(dp));
dp[0][0] = 0;
dp[0][1] = -prices[0];
for(int i=1; i<len; i++){
dp[i][0] = max(dp[i-1][0], dp[i-1][1]+prices[i]);
dp[i][1] = max(dp[i-1][1], -prices[i]);
}
return dp[len-1][0];
}
};