【动态规划】leetCode309.买卖股票时机含冷冻期 C语言版

给定一个整数数组,其中第 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]);   //最后哪个大
}

结果 

猜你喜欢

转载自blog.csdn.net/KK_1657654189/article/details/121270637