动态规划
shoushudao111
这个作者很懒,什么都没留下…
展开
-
牛客网-暗黑的字符串(动态规划)
暗黑的字符串总结题目的动态规划解法和普通的动态规划相比难点在于找公式,状态转移方程涉及到的不至是前一项,还有可能是前几项,所以在数学上推导,公式尽量网f(n)与f(n-1)...f(n-k)上靠拢。import java.util.*;public class Main { public static void main(String args[]){ Sc...原创 2018-11-10 10:10:36 · 280 阅读 · 0 评论 -
动态规划-最小花费
题目描述:在某条线路上有N个火车站,有三种距离的路程,L1,L2,L3,对应的价格为C1,C2,C3.其对应关系如下:距离s 票价0<S<=L1 C1L1<S<=L2 C2L2<S<=L3 C3输入保证0<L1<L2<L3<10^9,0<C1<C2&l...原创 2018-11-01 19:50:48 · 878 阅读 · 0 评论 -
516. Longest Palindromic Subsequence
516. Longest Palindromic Subsequence 字长回文子序列,动态规划公式是dp[left][right]=dp[left+1][right-1]+2(当s.charAt(left)==s.charAt(right))时,否则dp[left][right]=Math.max(dp[left+1][right],dp[left][right-1]);状态转移公...原创 2018-12-09 15:07:04 · 126 阅读 · 0 评论 -
95. Unique Binary Search Trees II
95. Unique Binary Search Trees II题目涉及到递归和动态规划,在树的相关题目中有很多是涉及到递归的。在解本道题时,主要有以下难点:(1)动态规划公式,f[i]=f[i]+f[j]*f[i-j-1],(j>=0 && j<=i);(2)克隆左右子树,在克隆左子树时直接克隆即可,但是在克隆右子树时,有一点很巧妙,就是子树的结构时...原创 2018-12-09 16:50:10 · 86 阅读 · 0 评论 -
96. Unique Binary Search Trees
96. Unique Binary Search Trees重点在找出动态规划公式,dp[i]=dp[i]+dp[i-j]*dp[j-1];意义:就是从n节点中依次选取一个节点作为跟节点,那么以跟节点为跟节点的树的个数就是,其左子树的种类乘以右子树的种类。 class Solution { public int numTrees(int n) { int ...原创 2018-12-09 16:59:15 · 76 阅读 · 0 评论 -
牛客网题解-Fibonacci数列
解法一:时间复杂度空间复杂度O(n) Fibonacci数列import java.util.*;public class Main { public static int MAX=32; public static void main(String args[]){ Scanner in=new Scanner(System.in); int...原创 2018-11-09 09:58:00 · 267 阅读 · 0 评论 -
376. Wiggle Subsequence
376. Wiggle Subsequence状态转移方程,有哪些状态,如何表示这些状态,它们之间有什么关系,怎么转移的。这里需要求出的是一个子序列,很明显有两种状态,如果我们用一个数组很难去描述两种状态,所以可以考虑用两个,并总结这两个之间是如何转换的。class Solution { public int wiggleMaxLength(int[] nums) { ...原创 2018-12-09 19:26:22 · 71 阅读 · 0 评论 -
467. Unique Substrings in Wraparound String
467. Unique Substrings in Wraparound String题目的意思是给一个无限循环的大字符串s,然后给一个小串p,求出p的子串在s中的个数;首先可以将其分为26个状态,每一个小写字母是一个状态。循环遍历字符串,判断其是否是s的子串。在第一种解法中使用了dp去更新,但是漏掉了两个相邻字符相等时对状态的影响。所以报错。修改为后面的解法,可避免此问题。小...原创 2018-12-09 21:18:17 · 169 阅读 · 0 评论 -
673. Number of Longest Increasing Subsequence
673. Number of Longest Increasing Subsequence最长递增子序列的个数。开始想着用回溯法去计算个数,后来发现实现有点困难,主要没有分情况讨论清晰。第二点时,某一长度的自增子序列的个数也可以用一个状态方程表示,然后更新。学到这两点。 class Solution { public int findNumberOfLIS(int[]...原创 2018-12-09 23:25:41 · 78 阅读 · 0 评论 -
718. Maximum Length of Repeated Subarray
718. Maximum Length of Repeated Subarray 状态转移方程,a[i]=b[j],dp[i][j]=?a[i]!=b[j],dp[i][j]=?class Solution { public int findLength(int[] a, int[] b) { int m = a.length, n = b.length; ...原创 2018-12-10 00:58:52 · 86 阅读 · 0 评论 -
动态规划-递归-递推Unique Binary Search Trees
Given n, how many structurally unique BST's (binary search trees) that store values 1...n?For example,Given n = 3, there are a total of 5 unique BST's. 1 3 3 2 1 \ ...原创 2018-11-01 11:35:51 · 142 阅读 · 0 评论 -
873. Length of Longest Fibonacci Subsequence
873. Length of Longest Fibonacci Subsequence题目求出最长的类似斐波那契数列,f[i]=f[i-1]+f[i-2],首先可以通过两个循环,给定不同的f[0],f[1],然后挨个寻找f[i-1]+f[i-2];难点在于寻找时我没有想到用集合的特性。还有就是动态规划讲的是状态之间的转移关系,这种思想,不是每个题目都需要按部就班的使用转移方程。 ...原创 2018-12-10 09:21:34 · 100 阅读 · 0 评论 -
377. Combination Sum IV(硬币找零)
377. Combination Sum IV解法一:递归,暴力解法,中间有很多重复计算。 超时class Solution { int cnt=0; public int combinationSum4(int[] nums, int target) { digui(nums,target); return cnt; } ...原创 2018-12-10 11:12:48 · 130 阅读 · 0 评论 -
leetcode 10. Regular Expression Matching & 44. Wildcard Matching
10. Regular Expression Matching思路:动态规划,首先是初始化,考虑s.length()为0时应该对p进行初始化,能初始化的位置是p.(i)=='*' dp[0][i-2]=true;第二步是状态转移方程,很多状态转移方程可分解为几个小问题,一个是分情况讨论,第二个是与前面一个状态或者若干状态的关系。往往这两个小问题是层层递进的,只有分情况讨论清晰了,才知道...原创 2019-06-25 00:13:18 · 183 阅读 · 0 评论 -
动态规划-硬币找零问题四种情况
题目1:给定数组arr,arr中所有的值都是正数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim代表要找的钱数,求组成aim的最少货币数。举例: arr[5,2,3],aim=20。 4张5元可以组成20元,其他的找钱方案都要使用更多张的货币,所以返回4。题解:一眼看去这道题好像可以用贪心算法可解,但是仔细分析发现有些值是不可以的,例如arr...原创 2018-10-30 10:43:34 · 968 阅读 · 0 评论 -
动态规划-开心的金明
题目描述金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”。今天一早金明就开始做预算,但是他想买的东西太多了,肯定会超过妈妈限定的N元。于是,他把每件物品规定了一个重要度,分为5等:用整数1~5表示,第5等最重要。他还从因特网上查到了每件物品的价格(都是整数元)...原创 2018-11-03 01:30:20 · 251 阅读 · 0 评论 -
牛客网-拼凑面额(经典动态规划)
拼凑面额题目描述给你六种面额1、5、10、20、50、100元的纸币,假设每种币值的数量都足够多,编写程序求组成N元(N为0-10000的非负整数)的不同组合的个数。输入描述:输入为一个数字N,即需要拼凑的面额输出描述:输出也是一个数字,为组成N的组合个数。思路:使用{1}组成n的解法,使用{1,5},的解法,使用{1,5,10...}的解法。公式如下:i...原创 2018-11-10 21:06:54 · 258 阅读 · 0 评论 -
334. Increasing Triplet Subsequence
334. Increasing Triplet Subsequence连续递增的长度为3的子序列,解法一:dp数组,分别记录当前位置的最大和最小数。时间复杂度O(n)。空间复杂度O(n).class Solution { public boolean increasingTriplet(int[] nums) { if(nums.length<3) ...原创 2018-11-19 01:01:52 · 91 阅读 · 0 评论 -
最长上升子序列
最长上升子序列动态规划解法:时间复杂度O(n2).代码简洁,时间复杂度高。class Solution { public int lengthOfLIS(int[] nums) { if(nums.length<=1) return nums.length; int dp[]=new int[nums.length...原创 2018-11-19 21:55:16 · 116 阅读 · 0 评论 -
209. Minimum Size Subarray Sum
209. Minimum Size Subarray Sum首先想到的是暴力解法,时间复杂度为O(n2),因为中间有很多重复计算。所以可以开一个数组保存前n项和。时间复杂度为O(n).class Solution { public int minSubArrayLen(int s, int[] nums) { if(nums.length==0) ...原创 2018-11-17 20:07:19 · 134 阅读 · 0 评论 -
221. Maximal Square
221. Maximal Square 思路:首先判断左上角是否等于1,然后再进行右下角的取值判断,右下角的取值是其位置上方、左侧、左上侧中最小的一个,至于为什么是这样,我觉得画个图一目了然。class Solution { public int maximalSquare(char[][] matrix) { if(matrix.length==0) re...原创 2018-11-25 19:14:50 · 131 阅读 · 0 评论 -
152. Maximum Product Subarray
152. Maximum Product Subarray 思路一:暴力。不同起点和终点的乘积挨个计算比较。class Solution { public int maxProduct(int[] nums) { int max_pro=Integer.MIN_VALUE; int temp_pro=1; for(int i=0;i...原创 2018-11-25 20:16:52 · 94 阅读 · 0 评论 -
279. Perfect Squares
279. Perfect Squares 动态规划,找出公式很重要,思考时纠结,缺少总结。class Solution { public int numSquares(int n) { int dp[]=new int[n+1]; Arrays.fill(dp,Integer.MAX_VALUE); dp[0]=0; ...原创 2018-11-29 13:54:29 · 142 阅读 · 0 评论 -
309. Best Time to Buy and Sell Stock with Cooldown
309. Best Time to Buy and Sell Stock with Cooldown题解报告:详情 class Solution { public int maxProfit(int[] prices) { if (prices.length <= 1) return 0; int s0[]=new int[prices.length]; ...原创 2018-11-29 14:50:27 · 110 阅读 · 0 评论 -
416. Partition Equal Subset Sum 494. Target Sum
416. Partition Equal Subset Sum 动态规划公式:dp[j]=dp[j] || dp[j-nums[i]]class Solution { public boolean canPartition(int[] nums) { if(nums.length==0) return false; int ...原创 2018-11-27 14:57:07 · 93 阅读 · 0 评论 -
337. House Robber III
337. House Robber III思路:看到树,最适合和树的操作相结合的就是递归操作,分析该问题,对于一个节点可分为两种情况:偷和不偷;进而进行递归,此时我们会发现递归中有很多重复操作。思考如何将递归的中间状态值保存下来,见解法二。class Solution { public int rob(TreeNode root) { if(root==nul...原创 2018-11-28 14:46:36 · 141 阅读 · 0 评论 -
Word Break
Word Break思路:如果在j处可以被分词,那么在j+1-i处在可以继续分割。class Solution { public boolean wordBreak(String s, List<String> wordDict) { boolean f[]=new boolean [s.length()+1]; f[0]=true;...原创 2018-12-07 17:40:13 · 84 阅读 · 0 评论 -
746. Min Cost Climbing Stairs
746. Min Cost Climbing Stairs是我见过一种比较新的递推公式。 class Solution { public int minCostClimbingStairs(int[] cost) { int [] dp=new int[cost.length+1]; dp[0]=0; dp[1]=0; for(int i=2;i<=cost.le...原创 2018-12-08 23:12:47 · 73 阅读 · 0 评论 -
873. Length of Longest Fibonacci Subsequence
873. Length of Longest Fibonacci Subsequence思路:起始点由两个点构成,所以有O(n2)种不同的起始点,然后在判断集合中是否存在前两项的和。class Solution { public int lenLongestFibSubseq(int[] A) { if(A.length<=2) retu...原创 2018-12-13 13:48:01 · 171 阅读 · 0 评论 -
Best Time to Buy and Sell Stock 题目集合
121.Best Time to Buy and Sell Stock思路:两个值一个值记录目前最大收益、一个值记录目前的最低买入,从前往后扫一遍,每次更新此前的最大收益,然后更新到此位置的最低买入。class Solution { public int maxProfit(int[] prices) { if(prices.length<=1) ...原创 2019-06-29 22:23:05 · 159 阅读 · 0 评论