Dynamic Programming
文章平均质量分 56
我为老师建博客
这个作者很懒,什么都没留下…
展开
-
72. Edit Distance Hard
//用dis[i][j]来表示s1长度为i的子串和s2长度为j的子串的编辑距离 //if i == 0 且 j == 0,edit(i, j) = 0//if i == 0 且 j > 0,edit(i, j) = j//if i > 0 且j == 0,edit(i, j) = i//if i >= 1 且 j >= 1 ,edit(i, j) == min{ edit(i-1, j)原创 2017-05-14 11:51:00 · 225 阅读 · 0 评论 -
494. Target Sum Medium
先给出一个递归的解法。主要思想:一组数,每个数会有 + 和 - 两种选择,那我们可以利用递归来遍历求解所有的情况,n个数,就有2^n种情况,实际上是一个二叉树,每个节点有两种选择。实现起来很简单,但是效率比较差,毕竟有些情况明显不可取,还是要遍历。class Solution {public: int count; int findTargetSumWays(vector& num原创 2017-05-31 21:54:22 · 138 阅读 · 0 评论 -
64. Minimum Path Sum Medium
求到达右下角的路径,使得路径上数的和最小。比较简单。每一个位置你选择从上面来更小还是左边来更小就好。class Solution {public: int minPathSum(vector>& grid) { int m = grid.size(), n = grid[0].size(); int d[m][n]; for (int原创 2017-06-09 16:51:18 · 253 阅读 · 0 评论 -
63. Unique Paths II Medium
接上一题Unique Paths,这里增加了有障碍的情况。其实也很好理解。对于数组中不是边界的情况,原本d[i][j]等于来自上方和左边两个的和,如果上面是障碍,则从上面来的路径数为0,左边类似。不同的是,边界中原本路径数为1,如果边界中有障碍,障碍后面的都为0。需要注意的是,存在起点有障碍和终点有障碍的情况。class Solution {public: int uniquePat原创 2017-06-09 16:33:23 · 135 阅读 · 0 评论 -
62. Unique Paths Medium
要求从左上角走到右下角的不同的路径数。主要思想:d[i][j]表示走到表格中(i, j)的路径数,下标从0开始。则有d[i][j] = d[i - 1][j] + d[i][j - 1]。class Solution {public: int uniquePaths(int m, int n) { int d[m][n]; for(int i =原创 2017-06-03 17:55:29 · 156 阅读 · 0 评论 -
494. Target Sum Medium
这道题按如下推导,把它转化成求是否存在子集的和为特定值。跟416. Partition Equal Subset Sum一样的做法。这里给出一维数组的简化版。这题的坑在于,要判断数组的和是否大于s,如果小于s,直接返回0,样例中有s=1000000000的情况,很坑爹sum(P) - sum(N) = targetsum(P) + sum(N) + sum(P) -原创 2017-06-01 20:09:42 · 176 阅读 · 0 评论 -
416. Partition Equal Subset Sum Medium
这道题要求把一组数分成相等的两部分,实际上是求数组中是否有子集等于特定值(这里特定值为所有数和的一半)。那么考虑子问题,数组中是否有子集等于target。我们用动态规划。主要思想:对于数组中的每个数,我们有取或不取两种选择,实际上是背包问题。设d[i][j]表示前i个数和为j的方案数,所以有状态转移方程:d[i][j] = d[i - 1][j] + d[i - 1][j原创 2017-06-01 17:46:15 · 294 阅读 · 0 评论 -
516. Longest Palindromic Subsequence Medium
这道题是求最长回文子序列,跟最长回文子串相似。用dp[ i ][ j ]表示s从 i 到 j 之间,它的最长回文子序列的长度。最终结果就是dp[ 0 ] [ s.size() - 1 ]。状态转移方程是:如果s[i] == s[j],那么dp[ i ][ j ] = dp[ i + 1 ][ j - 1 ] + 2。 否则 dp[ i ][ j ] = max(dp[ i + 1原创 2017-05-31 19:49:09 · 158 阅读 · 0 评论 -
5. Longest Palindromic Substring Medium
最长回文子串的求解,主要有这四种方法:1.暴力求解罗列所以可能的子串,一一判断是否是回文。 O(n^3)2.动态规划回文字符串的子串也是回文,比如P[i,j](表示以i开始以j结束的子串)是回文字符串,那么P[i+1,j-1]也是回文字符串。这样最长回文子串就能分解成一系列子问题了。这样需要额外的空间O(N^2),算法复杂度也是O(N^2)。(这是抄的)3.中心扩展原创 2017-03-05 01:14:49 · 238 阅读 · 0 评论 -
53. Maximum Subarray Easy
这是一道关于动态规划的简单题,求和最大的子串。我们使用一维数组sun[i]来表示,以i结尾的子串的和最大值,当i=0时,sum[0]肯定是nums[0],当i大于0时,状态转移方程为:sum[i] = sum[i - 1] > 0? sum[i - 1] + nums[i]: nums[i]; 解释:以i结尾的最大子串和,看前一个子串和是正还是负,如果是正,无论第i个数是正还是负,都要加上前面的子原创 2017-05-30 20:59:38 · 198 阅读 · 0 评论 -
583. Delete Operation for Two Strings Medium
这道题需要我们通过在两个字符串中分别删除一些字符,使得他们成为相等的字符串。跟编辑距离类似,我们采用动态规划来解决。(参考 http://blog.csdn.net/hhygcy/article/details/3948969)实际上,我们需要做的其实是求出最长公共子序列(Longest Common Subsequence)。注意这里是子序列,不是子串,是可以不连续的,只要保持相对顺原创 2017-05-14 18:23:42 · 474 阅读 · 0 评论 -
免费馅饼(DP新思路,从下往上填二维数组)
题目都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼。说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的10米范围内。馅饼如果掉在了地上当然就不能吃了,所以gameboy马上卸下身上的背包去接。但由于小径两侧都不能站人,所以他只能在小径上接。由于gameboy平时老呆在房间里玩游戏,虽然在游戏中是个身手敏捷的高手,但在现实中运动神经...原创 2019-01-04 23:12:46 · 225 阅读 · 0 评论