leetcode(动态规划专题)
线性DP
53. 最大子数组和
思路
code
int maxSubArray(vector<int>& nums) {//res:最后所有状态的最终Max结果//lat:当前f[i]状态的Maxint res = INT_MIN, last = 0;for (int i = 0; i < nums.size(); i++){//当前f[i]状态最大值(使用下面的状态转移方程得出)//f[i] = max( nums[i] , f[i - 1] + nums[i] )int now = max(last, 0) + nums[i];/*最终是所有状态取一个max所以此处保存前后两个状态相互比较的最终结果*/res = max(now, res);//更新最后,当为i时候,f[i]的最大值,即lastlast = now;}return res;}
120. 三角形最小路径和
思路
code
//自上而下
int minimumTotal(vector<vector<int>>& nums) {int n = nums.size();vector<vector<long long>>f(n, vector<long long>(n));f[0][0] = nums[0][0];for(int i = 1; i < n ;i++)for (int j = 0; j <= i; j++){f[i][j] = INT_MAX;//边界判断if (j > 0) f[i][j] = min(f[i][j], f[i - 1][j - 1] + nums[i][j]);if (j < i) f[i][j] = min(f[i][j], f[i - 1][j] + nums[i][j]);}long long res = INT_MAX;for (int i = 0; i < n; i++) res = min(res, f[n - 1][i]);return res;}//自下而上不需要考虑边界问题
int minimumTotal(vector<vector<int>>& f) {// f.size()-2 是因为最后一行不需要计算for (int i = f.size() - 2; i >= 0; i--)for (int j = 0; j <= i; j++)f[i][j] += min(f[i + 1][j], f[i + 1][j + 1]);return f[0][0];
}
63. 不同路径 II
思路
code
class Solution {
public:int uniquePathsWithObstacles(vector<vector<int>>& o) {int n = o.size();if (!n) return 0;int m = o[0].size();vector<vector<int>> f(n, vector<int>(m));for (int i = 0; i < n; i ++ )for (int j = 0; j < m; j ++ )//判断如果不为障碍物的话才执行if (!o[i][j]) {if (!i && !j) f[i][j] = 1;//特判左上角开始位置else {//如果不是第一行if (i) f[i][j] += f[i - 1][j];//如果不是第一列if (j) f[i][j] += f[i][j - 1];}}return f[n - 1][m - 1];}
};
121. 买卖股票的最佳时机
思路
此题目为一个动态规划的过程,目标是需要求得最大的利润。
1.最大利润(分析)把整个区间划分为若干份,计算出区间每一个的局部最大值,然后再比较出整体区间的最大值即为答案。
max(max[0],max[1],max[2],max[---])
2.当前最利润为:当前的元素prices[i] - 过往区间最小的值(minp),并且更新过往最大利润res
3.最终更新最小值(minp) = min(当前最小值(即prices[i]自身),过往区间最小值(minp))
4.总结 :线性记录 res 和 minp 始终为过往区间的(最大利润) 与 (最小值)
code
int maxProfit(vector<int>& prices) {//res为当前最终结果int res = 0;for (int i = 0, minp = INT_MAX; i < prices.size(); i++) {//prices[i] - minp为当天最大利润//max(res, prices[i] - minp)为截止至今日,最大利润//res = max(res, prices[i] - minp);更新当前扫描的最大利润res = max(res, prices[i] - minp);//更新前面最小值(当前更新位置始终为整个区间的最小值)minp = min(minp, prices[i]);}return res;
}
leetcode(动态规划专题)相关推荐
- Leetcode动态规划专题(共38道)
某一问题有很多重叠子问题 每一状态一定由上一状态推导出来 而贪心没有状态推导,而是直接选局部最优 解决方式: 确定dp数组(dp table)以及下标的含义 确定递推公式 dp数组如何初始化 确定遍历 ...
- LeetCode 动态规划《简单》部分 Python实现
#2018-06-07 June Thursday the 23 week, the 158 day SZ #LeetCode 动态规划简单部分 Python实现 '''爬楼梯 假设你正在爬楼梯.需要 ...
- 20200707:动态规划专题之不同路径
动态规划复习day01 动态规划的题目一直是本人的弱项,这周尝试连续7天的动态规划专题,争取做到有的放矢. 不同路径Ⅰ和Ⅱ解析 题目一:不同路径 解题思路 依据动态规划解题的套路思路 确定状态和选择, ...
- Leetcode动态规划部分典型题目分类及总结
参考内容 https://leetcode-cn.com/problems/longest-palindromic-substring/solution/zhong-xin-kuo-san-dong- ...
- ACM题解——动态规划专题——G天上掉馅饼
ACM题解--动态规划专题--G.天上掉馅饼 题目描述 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉 ...
- [LeetCode]动态规划求解博弈问题
博弈论是有趣又有用的知识,可以用来预测在特定的规则下,人们会做出怎样的行为,又会导致怎样的结果.利用博弈论来指导人们的行事法则甚至商业操作,比如著名的囚徒困境就被很好的利用在了商业竞争上.同样,Lee ...
- LeetCode动态规划股票系列整理
写在前面 股票感觉是LeetCode动态规划中系列最多的一类,交易次数不同,有冷冻期,含手续费,让买卖的最佳时机千奇百怪,但是只要掌握dp的方法,解决起来还是有套路可循的.依据dp的常规思想,股票问题 ...
- leetcode探索专题中的初级算法练习题(python代码+解题思路)
本文记录leetcode探索专题中的初级算法练习题,附python实现代码&解题思路,做题过程不免查阅网络资料,侵删~如有错误,欢迎指正交流! 目录 专题一:数组: 26.从排序数组中删除重复 ...
- LeetCode Hot100 ---- 动态规划专题
动态规划问题 力扣121:买卖股票(一次交易) 力扣122:买卖股票(多次交易) 力扣134:加油站 力扣309:买卖股票(包含冷冻时间) 力扣322:零钱兑换 力扣518:零钱兑换 力扣53:最大子 ...
最新文章
- Boost:自定义双端队列的测试程序
- 基于java的网络爬虫框架(实现京东数据的爬取,并将插入数据库)
- python场景应用方向_python的应用场景及学习方向
- 怎么能把看不清的照片给看清_拍完照不会后期怎么办?教你一个懒人办法,能帮照片变“高级”...
- Memcache 查看列出所有key的方法
- IOS动画隐式,显式,翻页
- Ubuntu下怎么通过命令完成蓝牙的配对和连接
- 写一个SFTP工具类实现连接
- 游程编码详解(C语言)
- php万能密码在线视频讲解,万能密码
- angularjs+uib-pagination实现同一页面多个分页功能
- http://gm100861.blog.51cto.com/1930562/954333
- 数据分析/机器学习 350+ 数据集链接整理,免费下载点开就用
- 彻底理解confidence interval和credible interval
- 如何选择工业中CCD相机与CMOS相机
- Windbg调试学习
- 栈和堆的区别是什么? 为什么说栈的速度快,堆的速度慢?
- java ios 3des_3DES在Android、Ios 和Java 平台的加密解密
- 南宁富士康c语言笔试题,富士康笔试题目
- GPS从入门到放弃(七) --- GPS卫星位置解算