动态规划
溯夜流云
这个作者很懒,什么都没留下…
展开
-
动态规划经典题目:最大连续子序列和、最大不连续子序列和
1.最大连续子序列和: 记数组为nums思路:记录dp[i]为i位置结尾的最大连续子序列和则有dp[i]=dp[i-1]>0?(dp[i-1]+nums[i]):nums[i];然后求dp数组的max即为最终结果1.最大不连续子序列和: 记数组为nums思路:记录dp[i]为i位置的最大不连续子序列和则有两种情况dp[i]=dp[i-1] 或者dp[i]=dp[i-2]+nums[i] 即不选或者选择当前位置那么整理为dp[i]=m...原创 2021-03-13 13:40:58 · 2010 阅读 · 0 评论 -
程序员面试指南(动态规划部分)5:最长公共子串
最长公共子串原创 2021-03-11 20:29:26 · 123 阅读 · 0 评论 -
程序员面试指南(动态规划部分)4:地下城游戏
class Solution {public: int calculateMinimumHP(vector<vector<int>>& dungeon) { //思路:需要计算最少所需的健康点,可以从最后的位置向前推 //因为最后位置所需的最少健康点是确定的 //由于骑士可以向右和向下,那么倒过来就是向左和向上推 //记dp[i][j]为i,j位置所需的最少血量,那么 //dp[i][j]=min{右边的最小,下边的最小}-dungeon[i][j]...原创 2021-03-11 19:38:14 · 168 阅读 · 0 评论 -
程序员面试指南(动态规划部分)3:最长递增子序列
class Solution {public: int lengthOfLIS(vector<int>& nums) { int length = 0; int size = nums.size(); if (size <= 1) return size; vector <int> d(size, 1); for (int i = 0; i < size; i++) for (int j = 0; j < i; ++j) ...原创 2021-03-10 16:29:54 · 117 阅读 · 0 评论 -
程序员面试指南(动态规划部分)3:换钱的方法数
思路1:简单暴力递归思路2:对暴力递归的优化:即通过map等数据结构记录已经计算过一次的状态,后面再次计算只需要查表即可思路3:动态规划原创 2021-03-10 16:01:32 · 127 阅读 · 0 评论 -
程序员面试指南(动态规划部分)2:矩阵的最小路径和
思路:经典动态规划,设置数组dp[i][j] 记录[i][j]位置的最短路径,由于只能向右或者向下走所以dp[i][j]=min{dp[i-1][j],dp[i][j-1]}+m[i][j];时间复杂度O(N*M),空间复杂度为O(N*M)空间复杂度可以考虑通过状态压缩,压缩到O(min(N,M)),即通过滚动数组来记录状态变换,但是这种压缩的方法不适合需要输出路径过程的场景。无法回溯过程。...原创 2021-03-10 15:41:47 · 191 阅读 · 0 评论 -
程序员面试指南(动态规划部分)1:斐波那契系列问题
普通思路:1:根据动态规划的状态公式 , 时间复杂度O(N)2:对以上算法中的动态规划公式,转换为矩阵相乘,利用矩阵乘法(矩阵快速幂) 时间复杂度O(logN)...原创 2021-03-10 14:03:03 · 142 阅读 · 0 评论 -
动态规划例题 1:交错字符串
思路:用dp[i][j] 表示s1的前i个与s2的前j个交错成s3的前i+j个的结果(true或false)初始状态dp[0][0]=true ,零和零组成零,没毛病class Solution {public: bool isInterleave(string s1, string s2, string s3) { int len1=s1.length(); int len2=s2.length(); int len3...原创 2021-02-22 20:22:00 · 187 阅读 · 0 评论