动态规划
tzyshiwolaogongya
这个作者很懒,什么都没留下…
展开
-
leetcode140——WordBreakⅡ
题目大意:给出字符串s和字典,用空格拆分字符串s,使得成为一个或多个在字典中出现的单词,找出所有可拆分的解。分析:动态规划。先用leetcode139判断是否有解。有解的基础上:状态:二维数组dp[i]——s[0~i-1]的所有可拆分情况(一堆字符串)初始化:vector<string>均为空结果:dp[s.size()]转移方程:如果s[0~i-i]有解——if(!dp[i].empty()) ,就遍历字典,依次拿出word匹配,如果有匹配当前s[i]的word:原创 2020-07-05 15:08:13 · 134 阅读 · 0 评论 -
leetcode494——Target Sum
题目大意:在数组中每个数前面添‘+’或‘-’,使得数组所有元素加和等于目标和,求添加符号的方法数(数组所有元素加和不超过1000)分析:方法一:dfs。每个位置的数有正负两种情况,递归数组中的每个数,遍历到数组末尾时判断加和是否等于目标和即可。时间复杂度为O(2^n)。方法二:动态规划。背包问题。状态:dp[i][j + 1000]——用nums[0~i]组合成j的方法个数。由于j可能...原创 2020-03-31 10:33:46 · 83 阅读 · 0 评论 -
leetcode416——Partition Equal Subset Sum
题目大意:判断能否将数组分割成两个等和的子集,元素均为正整数。分析:动态规划背包问题。原问题转化为是否能在数组中取出一些数,使得和为数组元素总和的一半。状态:dp[i][j]——nums[0~i]可选,是否能使得选出元素的总和为j。初始化:dp[0][0]=true,如果nums[0]≤数组元素总和的一半,那么dp[0][nums[0]] = true,因为第一个元素可选时,它只能让容...原创 2020-03-25 10:14:42 · 89 阅读 · 0 评论 -
leetcode309——Best Time to Buy and Sell Stock with Cooldown
题目大意:给出股票价格数组,可以进行多次买卖,但是卖出的第二天要休息,求最大收益分析:动态规划。状态:dp[i][0]——第i天不持有股票时获得的最大收益;dp[i][1]——第i天持有股票时获得的最大收益初始化:dp[0][0]=0,dp[0][1]=-0x3f3f3f3f结果:dp[n - 1][0]状态转移方程:dp[i][0] = max(dp[i-1][0], ...原创 2020-03-19 12:47:38 · 118 阅读 · 0 评论 -
leetcode122——Best Time to Buy and Sell Stock II
题目大意:给出每天的股票价格,可以进行多次的买进卖出,问经过这些天能够赚取的最大利润是多少分析:贪心法。贪心策略——每次有利可赚就要及时赚。我们算出每两天之间的价格差值,只要大于0就说明是有利润的,进行这个交易即可,否则不进行交易。(注:如果是一直递增,这样两两差值相加和首尾差值是相同的)代码:转载自https://leetcode.com/problems/best-time-to-bu...原创 2018-07-28 13:20:40 · 110 阅读 · 0 评论 -
leetcode121——Best Time to Buy and Sell Stock
题目大意:给出股票价格数组,只允许买卖一次,求最大收益分析:股票问题采用动态规划。但是这道入门题只允许买卖一次,有更简单的方法——一次遍历:遍历数组时维护当前的最低点,每一天都计算当天与当前最低点的差值,这就是收益,取收益最大值即可。代码:class Solution {public: int maxProfit(vector<int>& prices)...原创 2020-03-19 11:40:12 · 116 阅读 · 0 评论 -
leetcode120——Triangle
题目大意:求数字三角形自顶向下的最小路径和分析:和poj3176类似。两道题都可以空间优化,用一维dp数组即可。代码:class Solution {public: int minimumTotal(vector<vector<int>>& triangle) { int n = triangle.size(); ...原创 2020-03-17 11:14:08 · 103 阅读 · 0 评论 -
leetcode279——Perfect Squares
题目大意:求出加和能够组成目标值的完全平方数的最小个数分析:动态规划。dp[i]——目标值为i的完全平方数的最小个数。初始化:dp[i]=i,因为最多就是由1组成的,i需要i个1加和组成i。结果:dp[n]状态转移方程:dp[i]=min(dp[i],dp[i - j * j] + 1),逆向思考,加和为i所需要的完全平方数的个数由加和为i-j*j的个数+1得来代码:...原创 2020-03-16 10:08:35 · 138 阅读 · 0 评论 -
leetcode221——Maximal Square
题目大意:在一个由0和1组成的二维矩阵内,找到只包含1的最大正方形,并返回其面积。分析:动态规划。dp[i][j]——以matrix[i - 1][j - 1]为正方形右下角时的最大正方形边长初始化:dp[i][j] = 0状态转换方程:如果matrix[i - 1][j - 1] == ‘1’,更新dp[i][j] =min(dp[i - 1][j - 1],min(dp[i]...原创 2020-03-11 10:55:22 · 119 阅读 · 0 评论 -
leetcode139——WordBreak
题目大意:拆分字符串,判断拆分后的几个字符串是否都存在于字典中。分析:思路:dfs从每个位置拆分字符串,前缀在字典里的前提下继续dfs字符串的另一半,直到整个字符串作为前缀时也存在于字典中实际方法:动态规划(因为dfs时间复杂度太高,超时)。dp含义:dp[i]——s[0,i-1]是否满足题意(字符串前i位是否符合要求)初始化:dp[0] = true 因为空串默认存在于字典中...原创 2020-02-27 10:58:11 · 140 阅读 · 0 评论 -
leetcode119——Pascal's TriangleⅡ
题目大意:求第n行杨辉三角,空间复杂度优化到O(n)代码:class Solution {public: vector<int> getRow(int rowIndex) { vector<int> row; for(int i = 0;i <= rowIndex;i++){ row.push...原创 2020-02-14 11:57:52 · 96 阅读 · 0 评论 -
leetcode118——Pascal's Triangle
题目大意:求n行杨辉三角代码:class Solution {public: vector<vector<int>> generate(int numRows) { vector<vector<int>> dp; if(numRows == 0) return dp; dp.push...原创 2020-02-13 12:59:48 · 105 阅读 · 0 评论 -
poj1934——Trip
题目大意:按字典序输出两个字符串的最大公共子序列分析:LCS长度可以通过动规求得,但是输出所有LCS就要通过另一个数组来记录。last1[i][j]记录字符串1的前i位中j字符的lastindex,last2[i][j]记录字符串2的前i位中j字符的lastindex。然后dfs从后向前递归,当dp[last1[i][j]][last2[i][j]]等于LCS长度时说明j字符是LCS的一员,直...原创 2019-10-28 21:50:13 · 160 阅读 · 0 评论 -
leetcode213——House Robber II
题目大意:给出按环形排列的一些住宅每家拥有的钱数,如果要求不能同时抢劫相邻的两家,问最多能抢多少钱分析:动规。和leetcode198一样的动规。由于这道题按环形排列,也就是说第一个和最后一个不能同时被抢,所以分别算出不抢第一个和不抢最后一个的金额,取较大的一个代码:class Solution {public: int rob(vector<int>&...原创 2018-07-28 16:24:14 · 114 阅读 · 0 评论 -
leetcode152——Maximum Product Subarray
题目大意:给出一个数组,求出乘积最大的连续子数组分析:动规。 乘法和加法的不同之处在于它的符号问题能够造成很大影响,如果当前数为负数,乘上之前的最小数会变为最大数,而当前数是正数时,乘之前的最大数才是最大数,所以在求解时要维护两方面的dp状态,一个是之前的最大值,一个是之前的最小值,由此得出全局最大值。 dpMax[i] =max(nums...原创 2018-07-28 15:04:43 · 122 阅读 · 0 评论 -
poj1384——Piggy-Bank
题目大意:给出不同面值的金币的面值及重量,问所给重量的猪罐中最少有多少钱输入:金币种类数T 空猪重量E 猪罐装满后的重量F 第i中面值的金币的价值pi 重量wi(共T行)输出:如果刚好可以装满则输出:The minimum amount of money in the piggy-bank is 最小钱数. 如果不能刚好装满则输出:This ...原创 2018-07-11 07:49:57 · 228 阅读 · 0 评论 -
poj1700——Crossing River
题目大意:只有一艘船,船上最多载两个人,问让所有人过河的最短时长代码:转载自https://blog.csdn.net/vmurder/article/details/40826151#include <cstdio>#include <cstring>#include <algorithm>#define N 1005using namespace s...原创 2018-07-09 10:51:20 · 162 阅读 · 0 评论 -
leetcode96——Unique Binary Search Trees
题目大意:将数字1~n构建成二叉搜索树,问有多少种构建方法分析:动规。 状态:dp[i]——由i个数字构建成二叉搜索树的方式个数 初始化:dp[0]=1(空树,为一种方式);dp[1]=1(单节点树,为一种方式) 结果:dp[n] 状态转移方程:dp[i]=sum{dp[k-1]*dp[i-k]} 1&l...原创 2018-06-19 18:46:34 · 127 阅读 · 0 评论 -
leetcode97——Interleaving String
题目大意:给出三个字符串,问第三个可否由前两个字符串组成,要求在第三个字符串中的字符顺序较原字符串而言不能改变分析:动规。递归超时,选择动规。两个字符串可以作为一个二维地图,我们需要做的就是判断能否从左上角走到右下角。 向右走就是s2的这位去匹配s3的当前位,向下走就是s1的这位匹配s3的当前位。 代码:class Solution {...原创 2018-06-23 17:34:55 · 127 阅读 · 0 评论 -
leetcode322——Coin Change
题目大意:给出几种硬币的面值数组,问最少用多少个硬币可以组合出目标金额,如果无论如何都组合不出则返回-1分析:动规。完全背包问题的应用。 状态:dp[j]——前i种面值可选,总额为j时使用的硬币个数最小值 初始化:dp[0]=0;dp[j]=0x3f3f3f3f 结果:dp[amount]/-1 状态转移方...原创 2018-06-22 17:11:35 · 129 阅读 · 0 评论 -
leetcode646——Maximum Length of Pair Chain
题目大意:对与对之间想要形成一个链就需要满足对1的第二个数小于对2的第一个数,问最长能形成多长的链分析:动规。LIS的应用。动规之前需要根据数组的第一个数先进行从小到大排序。代码:class Solution {public: static bool cmp(const vector<int>& a,const vector<int>&...原创 2018-07-30 19:31:47 · 264 阅读 · 0 评论 -
leetcode583——Delete Operation for Two Strings
题目大意:给出两个字符串,如果每次可以删除一个字母,想使得他们最后完全相同,最少需要多少次删除分析:动规。典型的LCS问题应用。答案就是两个字符串的长度之和减去两倍的LCS长度。 状态:dp[i][j]——以字符串1的下标i-1和字符串2的下标j-1结尾的最长公共子串长度 初始化:dp[i][0]=dp[0][j]=0 结果:d...原创 2018-06-22 07:51:18 · 235 阅读 · 0 评论 -
leetcode337——House Robber III
题目大意:给出一个二叉树,每个结点代表一个房子里的金额,小偷不能偷相邻结点的钱,问最多能偷多少钱分析:树形动规。分别求出选择和不选择这个结点的两种情况下的dp值,取最大。代码:转载自class Solution { vector<int> getMoney(TreeNode* node) { vector<int> ret(2, 0);...原创 2018-07-28 17:08:56 · 199 阅读 · 0 评论 -
leetcode740——Delete and Earn
题目大意:给出整数数组nums,每当取出一个数时,比它大一和小一的数都会从数组中被删掉,问取出的数的最大总和分析:动规。和之前的leetcode198有联系。由于对于几个相同的数值i,要么全取出,要么全删除,所以我们将每个数值i都作为新数组house的下标,新数组就是代表了每个房子的价值(数值为i的数字总和就是房子i的价值),取了i就不能取i+1和i-1,也就是我们不能取相邻的两个房子。后面就...原创 2018-07-29 13:59:37 · 132 阅读 · 0 评论 -
poj3345——bribing FIPA
题目大意:美丽城镇想用钻石贿赂参与投票的国家给它投票,当贿赂一个国家时,还包含了这个国家管辖的国家,问最少用多少钻石能让美丽城镇赢得票选输入:参与投票国家数量n 美丽城镇赢得票选所需票数m(1 国家名字 贿赂它所需的钻石数量 它管辖的国家名字 #//代表结束输入输出:最少钻石数量分析:树形动态规划 由于输入可能是个原创 2017-11-02 20:58:28 · 192 阅读 · 0 评论 -
leetcode174——Dungeon Game
题目大意:骑士从二维地牢的左上角开始走,要去救右下角的公主,地牢的每一个位置都有一个血量,大于0意味着增血,小于0意味着受伤,如果血量到达0或0以下就会死亡,问骑士的最初血量最少是多少才能救回公主分析:动规。从右下角开始走,倒推初始血量。 状态:dp[i][j]——在位置(i,j)时所需的最小血量(至少得有多少血) 初始化:dp[m-1][n...原创 2018-07-31 19:41:27 · 128 阅读 · 0 评论 -
leetcode712——Minimum ASCII Delete Sum for Two Strings
题目大意:给出两个字符串,删除其中的字母使得两个字符串相同,删除字母的代价是该字母的ASCII值,问最小代价是多少分析:动规。LCS的应用。类似编辑距离那道题,匹配两个字符串,如果字符相同就没有代价,如果不同就删除串1或串2的这一位。代码:class Solution {public: int minimumDeleteSum(string s1, string s2) {...原创 2018-07-31 17:52:54 · 310 阅读 · 0 评论 -
leetcode673——Number of Longest Increasing Subsequence
题目大意:给出乱序数组,求出数组中有多少组的长度等于LIS长度的分析:动规。普通的LIS题就是求出升序子序列长度,而这道题要求求出有多少个LIS,所以在dp外还需要一个ans数组来辅助记录。 状态:ans[i]——截止到i的LIS个数 初始化:ans[i]=1(每个数自己而言就是最大子序列,...原创 2018-07-30 22:37:16 · 180 阅读 · 0 评论 -
leetcode334——Increasing Triplet Subsequence
题目大意:问所给数组是否包含长度为3的上升子序列分析:动规/双指针。LIS的应用。但是这样的时间复杂度还是很高,有点没有必要,而且空间复杂度也有O(n)。还有一种方法,只需要O(n)的时间复杂度和O(1)的空间复杂度,只需要两个指针维护数组的最小值和次小值即可,当找到比次小值大的数时就说明有一个长度为3的上升子序列。(注:题目要求遍历一次/O(n)这种的,往往都是通过设置标识变量来维护某个值从...原创 2018-07-30 19:16:25 · 271 阅读 · 0 评论 -
leetcode639——Decode Ways II
题目大意:将给出的字符串译码,字符串可能包含数字0~9和*,1~26分别对应英文的二十六个字母,问给出的字符串有多少种译码方式,由于结果可能会很大,所以方法返回个数%1000000007分析:动规。两种情况:要么s[i]独立译码,方法个数为dp[i-1]*(s[i]这一位的译码方式个数) 要么s[i-1]...原创 2018-07-30 18:53:28 · 370 阅读 · 0 评论 -
leetcode516——Longest Palindromic Subsequence
题目大意:求出所给字符串中的最长回文子序列长度分析:动规。 状态:dp[i][j]——i~j的最长回文子序列长度 结果:dp[0][s.size()-1] 初始化:dp[i][i]=1 状态转移方程:if(s[i]==s[j]) dp[i][j]=dp[i+1][j-1]+2 ...原创 2018-07-29 17:16:40 · 249 阅读 · 0 评论 -
leetcode304——Range Sum Query 2D - Immutable
题目大意:给出二维数组,求出以左上角(row1,col1)和右下角(row2,col2)这两个点组成的矩形内的数字之和分析:动规。 状态:dp[i][j]——以左上角(0,0)和右下角(i,j)这两个点组成的矩形内的数字之和 结果:sum(row1,col1,row2,col2)=dp[i][j]-dp[i][j-1]-dp[i-1][j]-...原创 2018-07-29 15:58:15 · 117 阅读 · 0 评论 -
leetcode300——Longest Increasing Subsequence
题目大意:求出所给数字序列中的最长上升子序列长度。分析:动规。 状态:dp[i]——以下标为i的数字结尾得到的最长上升子序列长度 初始化:dp[i]=1 结果:max{dp[i]} 状态转移方程:dp[i]=max{dp[i],dp[j]+1} (j<i,nums[j]<nums[i])代码:class Solu...原创 2018-06-21 20:05:36 · 88 阅读 · 0 评论 -
leetcode91——Decode Ways
题目大意:二十六个字母对应数字1~26进行编码,给出一个数字字符串,求出这个数字的解码一共有多少种方式分析:动规。 状态:dp[i]——前i位数字对应的编码方式个数 初始状态:dp[0]=1;一个数字只有一种解码方式 如果下标1的数字是0,判断下标0的数字是否是1或2,如果是,则dp[1]=1;如果不是则返回0...原创 2018-06-13 17:21:01 · 138 阅读 · 0 评论 -
leetcode72——Edit Distance
题目大意:给出两个字符串,求出将其中一个变成另一个所需的最小操作数(最小距离),操作有三种——添加、删除、更换一个字符分析:动规。 状态:dp[i][j]——word1[0]到[i-1]和word2[0]到[j-1]的最小距离 初始化:dp[i][0]=i(因为0~i-1是i个字符,需要在word2插入i个字符,最小距离为i) ...原创 2018-05-15 14:07:34 · 168 阅读 · 0 评论 -
poj1947——rebuilding roads
题目大意:给出一棵树,问最少减去几条边,能得到一个有p个结点的子树输入:原树结点个数n p(1 结点i(父亲) i的儿子j输出:最少减去的边数分析:树形动态规划 状态dp[i][j]:以i为根节点,要得到j个结点的子树去掉的最少边数(注意子树中包含i结点) 状态转移方程:对于结点i,要么删掉它的某个儿子c,即删掉i原创 2017-11-03 10:00:55 · 149 阅读 · 0 评论 -
poj1463——strategic game
题目大意:给出一个树形图,结点放置士兵看守与这个结点相邻的路,问最少放置多少个士兵能把所有路看守住输入:结点个数n(0<=n<=1500) 结点符号:(相邻路的个数) 相邻结点i ...//相邻路数不超过10,且每条路只出现一次 或 结点符号:(0)//没有相邻的路输出:最少士兵个数分析:树形动态规划d...原创 2017-11-02 17:27:11 · 213 阅读 · 0 评论 -
poj1185——炮兵阵地
题目大意:n*m的网格分布着山地H和平原P,只有平原可以放一只炮兵部队,每个部队能攻击自己上下左右四个方向相邻两个网格,任何一只部队不能放在其他部队的攻击区域内,问最多能放多少只炮兵部队输入:n m 网格HP分布输出:炮兵部队的最大数量分析:动态规划,经典的状态压缩(二进制压缩成十进制)。第i行能放多少炮兵部队,取决于第i-1、i-2行,而对于每一行,每个网格只原创 2017-11-02 14:12:07 · 194 阅读 · 0 评论 -
poj3280——cheapest palindrome
题目大意:在原字符串中添加或删除字母,使其成为回文串,添加、删除每个字母的代价不同,问最小代价是多少输入:原字符串包含的字母种类数N 原字符串长度M(1<=N<=26)(1<=M<=2000) 原字符串 第i种字母 添加代价 删除代价(0<=cost<=10000)输出:最小代价分析:区间动态规划 ...原创 2017-10-31 14:31:44 · 183 阅读 · 0 评论 -
poj2533——longest ordered subsequence
题目大意:找出最长上升子序列LIS的长度输入:原序列长度n 原序列数字输出:LIS长度分析:动态规划 状态dp[i]:以i结尾的最长上升子序列长度 结果:max{dp[i]} 初始化边界:dp[0]=0 状态转移方程:dp[i]=max{dp[i],dp[j...原创 2017-10-29 16:17:57 · 180 阅读 · 0 评论