题目

26年7月18日(首刷自解)
Go
func maxProfit(k int, prices []int) int {
dp:=make([][]int,len(prices)+1)
n:=k*2
for i,_ := range dp{
dp[i]=make([]int,n)
}
for k:=0;k<n;k++{
if k%2==1{
dp[0][k]=0
}else{
dp[0][k]=-prices[0]
}
}
for i:=1;i<=len(prices);i++{
for k:=0;k<n;k++{
if k%2==0{
if k==0{
dp[i][k]=max(-prices[i-1],dp[i-1][k])
}else{
dp[i][k]=max(dp[i-1][k-1]-prices[i-1],dp[i-1][k])
}
}else{
dp[i][k]=max(dp[i-1][k-1]+prices[i-1],dp[i-1][k])
}
}
}
res:=0
for i:=0;2*i<n;i++{
res=max(res,dp[len(prices)][i*2+1])
}
return res
}
思路
上一道题,股票3是只能买两次,现在换成了只能买k次,其实还是具体的次数,但是换成了一个代数,所以我们要找的就是一个规律性一个总结的做法
那么其实在上一道题Leetcode 123.买卖股票3中,就发现奇数偶数的递推表达式是有一定规律的,当然要取决于状态的具体对应数字,这道题就用到了。当奇数时怎么样,偶数时递推公式又是怎么样的。
最后算结果时,是要在n次没有持有的状态下找最大值