动态规划——Best Time to Buy and Sell Stock IV
Posted messi2017
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态规划——Best Time to Buy and Sell Stock IV相关的知识,希望对你有一定的参考价值。
这是这个系列题目的第四个,题目大意和之前的差不多,但是这次提供最多k次的操作,操作还是不能同时操作即必须结束前一个操作才能进行后一个操作。
状态比较好理解,就是题目要求的缩小版,dp[k][i]表示进行到第i天时最多k次操作能得到的最大利益,但是要注意最后一次操作不一定时第i天完成的。
状态转移方程:dp[k][i] = max(dp[k][i-1],dp[k-1][j]+prices[i]-prices[j]) (0<=j<=i)
比如现在正在考虑dp[k][i],选择有两种,一是第i天不操作,二是在第k-1次第j天后进行第k次操作。这个题的状态转移方程相对来说还是比较容易理解的。
状态转移方程:dp[k][i] = max(dp[k][i-1],dp[k-1][j]+prices[i]-prices[j]) (0<=j<=i)
比如现在正在考虑dp[k][i],选择有两种,一是第i天不操作,二是在第k-1次第j天后进行第k次操作。这个题的状态转移方程相对来说还是比较容易理解的。
当然如果给的操作数比总天数的一半还要多的话,相邻两天一次交易即可,当然要保证后一天的价格比前一天的价格要高。这种情况就不用再动态的递推了,直接累加即可。
1 class Solution{ 2 public static int maxProfit(int k,int[] prices) { 3 int nlen = prices.length; 4 if(nlen<=1)return 0; 5 else if(k>nlen/2) { 6 int res = 0; 7 for(int i = 1;i<nlen;i++) 8 if(prices[i]>prices[i-1])res+=(prices[i]-prices[i-1]); 9 return res; 10 }else { 11 int temp = 0; 12 int[][]dp = new int[k+1][nlen]; 13 Arrays.fill(dp[0],0); 14 for(int i = 0;i<=k;i++) 15 dp[i][0] = 0; 16 for(int kt = 1;kt<=k;kt++) { 17 for(int i = 1;i<nlen;i++) { 18 temp = 0; 19 for(int j = 0;j<=i;j++) 20 temp = temp>(dp[kt-1][j]+prices[i]-prices[j])?temp:(dp[kt-1][j]+prices[i]-prices[j]); 21 dp[kt][i] = dp[kt][i-1]>temp?dp[kt][i-1]:temp; 22 } 23 } 24 return dp[k][nlen-1]; 25 } 26 } 27 }
不过在最后说一句,由于我编写的代码使用了三层for循环,时间复杂度为O(n^3),在LeetCode上仅仅击败了不到9%的人,额,又是一个比较惨淡的数据了。。。。
以上是关于动态规划——Best Time to Buy and Sell Stock IV的主要内容,如果未能解决你的问题,请参考以下文章
[动态规划] leetcode 309 Best Time to Buy and Sell Stock with Cooldown
动态规划——Best Time to Buy and Sell Stock IV
LeetCode 188. Best Time to Buy and Sell Stock IV (动态规划)
Leetcode 121. Best Time to Buy and Sell Stock 最佳股票售卖时(动态规划,数组,模拟)