func maxProfit(k int, prices []int) int {
profit := 0
if k >= len(prices)/2 { //无限次交易,贪心算法
for i := 0; i < len(prices)-1; i++ {
if prices[i] < prices[i+1] {
profit += prices[i+1] - prices[i]
}
}
return profit
}
//规定次数交易,动态规划
profit_0 := make([][]int, len(prices)) //不持有股票
profit_1 := make([][]int, len(prices)) //持有股票
//创建二维切片
for i := 0; i < len(prices); i++ {
profit_0[i] = make([]int, k+1)
profit_1[i] = make([]int, k+1)
}
//初始化第一天
for j := 0; j <= k; j++ {
// 第0天如果持有股票的状态,init
profit_1[0][j] = -prices[0]
}
//状态转移方程
for x := 1; x < len(prices); x++ { //遍历每天股票价格
for y := 1; y < k+1; y++ { //遍历每次交易
profit_0[x][y] = max(profit_0[x-1][y], profit_1[x-1][y]+prices[x])
if profit < profit_0[x][y] {
profit = profit_0[x][y]
}
profit_1[x][y] = max(profit_1[x-1][y], profit_0[x-1][y-1]-prices[x])
}
}
return profit
}
func max(x int,y int) int{
if x<y{
return y
}
return x
}
作者:li-xiao-xi
链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-iv/solution/zai-suo-you-go-ti-jiao-zhong-ji-bai-liao-9853-de-y/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
作者:labuladong
链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-iv/solution/yi-ge-tong-yong-fang-fa-tuan-mie-6-dao-gu-piao-w-5/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
关键这里的i代表天数,k代表第k次交易。
而i又代表价格。所有i是price的长度循环。
dp[i][k][0] = max(dp[i-1][k][0], dp[i-1][k][1] + prices[i])
max( 选择 rest , 选择 sell )
解释:今天我没有持有股票,有两种可能:
要么是我昨天就没有持有,然后今天选择 rest,所以我今天还是没有持有;
要么是我昨天持有股票,但是今天我 sell 了,所以我今天没有持有股票了。
dp[i][k][1] = max(dp[i-1][k][1], dp[i-1][k-1][0] - prices[i])
max( 选择 rest , 选择 buy )
解释:今天我持有着股票,有两种可能:
要么我昨天就持有着股票,然后今天选择 rest,所以我今天还持有着股票;
要么我昨天本没有持有,但今天我选择 buy,所以今天我就持有股票了。
作者:labuladong
链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-iv/solution/yi-ge-tong-yong-fang-fa-tuan-mie-6-dao-gu-piao-w-5/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
如果光从i,k来看,就是一个二维矩阵,因此我们从上到下,从左到右遍历。