题目来源:http://bailian.openjudge.cn/practice/4121/
解题思路
- 假设股票数组为prices
- 设F[k][i]表示到第i天总共买卖k次时的最大利润,可以将其分为两种情况,即第i天卖出股票和未卖出股票。
- 假如第i天没有卖出股票,F[k][i] = F[k][i-1]
- 假如第i天卖出了股票,那么F[k][i] = max{prices[i] - prices[t]+F[k-1][t]},为什么是这个推导公式,因为假如F[k][i]的最优解是,第x天是k-1次的卖出,随后的第y天又买入,第i天卖出,于是F[k][i] = F[k-1][x]+prices[i]- prices[y](x<= y <=i),此时必然有F[k-1][x] =F[k-1][y],证明如下:
- 很显然,F[k-1][y]>=F[k-1][x],假设F[k-1][y]>F[k-1][x],此时必然有F[k-1][y]+prices[i]-prices[y]>F[k][i] = F[k-1][x]+prices[i]- prices[y],这与最优解矛盾,因此必然有F[k-1][x] =F[k-1][y],因此F[k][i]的推导公式可以写成max{prices[i] - prices[t]+F[k-1][t]}。
- 对上述进行优化,max{prices[i] - prices[t]+F[k-1][t]} = prices[i] +max{F[k-1][t]-prices[t]}; (0<=t<=i-1), 对于确定的i和k,每次求max{F[k-1][t]-prices[t]}都需要对t从1到i进行遍历,于是可以在循环中,求解时用一个临时变量tmp记录max{F[k-1][t]-prices[t]},t属于[0,i-1],每次i增量时比较tmp和F[k-1][i]-prices[i]和tmp的较大值赋给tmp,再进行求解。
AC代码
代码中nums即为解题思路中的prices
1 |
|