随笔分类 -  DP

动态规划类问题
摘要:方法一、DP 假设dp[i][j]表示从i到j下标是否是回文串 于是有dp[i][j]=dp[i+1][j-1]^(s[i]==s[j]) 时间O(n^2),空间O(n^2) 1 public String longestPalindrome(String s) { 2 int len = s.le 阅读全文
posted @ 2021-05-24 14:32 jchen104 阅读(57) 评论(0) 推荐(0)
摘要:题目要求s需要是t的子序列,子序列的定义是t中删除一些元素能够与s保持一致。 类似的题目有求2个字符串的最长公共子序列,经典的DP题。 不过本题我们可以偷懒使用双指针来处理,可以把题目简化为 s中的每一个字符是否都能在t中找到对应 时间O(m+n)(m、n分别为字符串s和t的长度),空间O(1) 1 阅读全文
posted @ 2021-05-08 11:52 jchen104 阅读(109) 评论(0) 推荐(0)
摘要:根据题目的意思,我们可以多次买卖,也就是说我们可以叠加 多次股价上升,遇到当前元素比前一元素大则计算出这次叠加的效果。 时间O(n),空间O(1) public int maxProfit(int[] prices) { if (prices==null || prices.length==0) r 阅读全文
posted @ 2021-03-30 16:27 jchen104 阅读(26) 评论(0) 推荐(0)
摘要:很经典的DP题,用dp[i]纪录[0,i]的数组的最大子序和,往后递推实际上就是判断 nums[i+1]是否能给dp[i+1]带来增益效果,使得dp[i+1]>dp[i] public int maxSubArray(int[] nums) { // dp[i]纪录以截至i结尾的最大子序和 int[ 阅读全文
posted @ 2021-03-26 10:40 jchen104 阅读(48) 评论(0) 推荐(0)