博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
动态规划——Best Time to Buy and Sell Stock IV
阅读量:6671 次
发布时间:2019-06-25

本文共 1358 字,大约阅读时间需要 4 分钟。

这是这个系列题目的第四个,题目大意和之前的差不多,但是这次提供最多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次操作。这个题的状态转移方程相对来说还是比较容易理解的。
当然如果给的操作数比总天数的一半还要多的话,相邻两天一次交易即可,当然要保证后一天的价格比前一天的价格要高。这种情况就不用再动态的递推了,直接累加即可。
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
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
(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%的人,额,又是一个比较惨淡的数据了。。。。

转载于:https://www.cnblogs.com/messi2017/p/9903335.html

你可能感兴趣的文章
第一次使用IDEA遇到的问题
查看>>
DDD CQRS架构和传统架构的优缺点比较
查看>>
前端源码安全
查看>>
java二维数组的常见初始化
查看>>
关于开发WPF的一些感想
查看>>
UML介绍--用例图
查看>>
iOS 真机调试(史上最详细步骤解析,hmt精心打造)
查看>>
LVS三种模式与八种调度算法
查看>>
让定义的接口可读性更强
查看>>
WordPress上传含有中文文件出现乱码
查看>>
解析UIControl
查看>>
【MySQL】数据库字符校对规则
查看>>
分形几何算法和实现(C语言)
查看>>
设计模式[2]-Chain of Responsibility
查看>>
Nginx+Tomcat动静分离及Nginx优化(企业案例)
查看>>
软件事务内存导论(五)创建嵌套事务
查看>>
[翻译] ClockView 时钟
查看>>
Cocos2d-X-3.0之后的版本的环境搭建
查看>>
[翻译] TCBlobDownload
查看>>
阿里云DTS VS MySQLdump
查看>>