给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。
设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):
你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。
示例:
输入: [1,2,3,0,2]
输出: 3
解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]
dp[i]表示第i天可以获得的最大股票利润,为什么用二维数组表示状态呢,因为明天后天能不能买能不能卖取决于今天有没有,然后二者取最大值
1.当天没有股票,可能的情况有两种:
一种是昨天有今天刚好卖出去了,今天就没有,说明昨天买入了,所以昨天会有股票在手,即dp[i-1][1],所以利润就是昨天的股票状态+今天卖出去的价格,
一种是昨天就没有,今天也没有,那么利润就是昨天的利润状态,即dp[i-1][0]
2.当天有股票,可能的情况也是两种:
一种是昨天就有,昨天有今天也有,说明这个股票没有卖出,啥也没干,那么利润就是昨天的利润状态,即dp[i-1][1]
一种是昨天没有今天有了,那就说明是今天刚买的,那么一定在前天有卖出,又经历了昨天的冷冻期,所以今天可以买入,利润就是前天的状态-今天买入的价格,因为是自己买的自掏腰包所以要减去
初始值的确定:
初始值,一开始的状态,也是两种:
一开始没有股票,那么利润也是0
一开始就有股票,那么利润就是你自己掏钱买时花的钱,为负
最后看两个状态下(有、没有)哪个的利润最大
代码如下:
int max(int a,int b){
return a>b?a:b;
}
int maxProfit(int* prices, int pricesSize){
//边界的确定
if(pricesSize==0) return 0;
int dp[pricesSize][2];
memset(dp,0,sizeof(int)*pricesSize*2);
//初始化
dp[0][0] = 0;
dp[0][1]= 0-prices[0];
int i;
for(i=1;i<pricesSize;i++){ // i从1开始!!
dp[i][0]=max(dp[i-1][0],dp[i-1][1]+prices[i]);
dp[i][1]=max(dp[i-1][1],(i-2>=0?dp[i-2][0]:0)-prices[i]);
}
return max(dp[pricesSize-1][0],dp[pricesSize-1][1]); //最后哪个大
}