139、300、152

139

这道题是完全背包类问题,可以把字符串当作背包,字典当作物品,同时本题求解的是排列数。dp[i]表示字符串数量为i的背包能否在字典中找到对应的字符,能就是true,否则就是false。递推关系是如果前一个dp返回的是true,而且当前字符能在字典中找到,那么当前dp就是true。

300

这道题的dp[i]表示以nums[i]为结尾的递增子序列的最长长度是dp[i],递推关系是if(dp[i]>dp[j]) dp[i]=max(dp[i],dp[j]+1),由这个递推关系就能得到遍历顺序了。

class Solution {

public:

    int lengthOfLIS(vector<int>& nums) {

        int n=nums.size();

        vector<int> dp(n,1);

        int ans=1;

        for(int i=1;i<n;i++)

        {

            for(int j=0;j<=i;j++)

            {

              if(nums[i]>nums[j]) dp[i]=max(dp[j]+1,dp[i]);

            }

            if(dp[i]>ans) ans=dp[i];

        }

        return ans;

    }

};

152

这道题的思路是因为不知道元素的正负号,最小的负值和最大的正值都有可能称为乘积最大的值,所以这里维护两个值dpmin和dpmax,dpmin保存每次遍历的最小值,dpmax保存每次遍历的最大值。定义t_max和t_min,t_max用于计算dpmax与当前值的积,t_min用于计算当前值与dpmin的积。同样是因为当前值可正可负,所以递推关系是: dpmax=max(max(t_max,t_min),nums[i]); dpmin=min(min(t_min,t_max),nums[i])。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 动态规划常常适用于有重叠子问题和最优子结构性质的问题,并且记录所有子问题的结果动态规划有自底向上(递推)和自顶向下...
    知向谁边阅读 286评论 0 1
  • 算法口试也就是用自然语言描述算法,脑海中要有一个流程图。 【目录】考点一:循环考点二:递归考点三:排序考点四:查找...
    三金姐姐阅读 708评论 -1 2
  • 51. 加法 不使用+、-,计算两数字之和 52. 至少有K个重复字符的最长子串 找到给定字符串(由小写字符组成)...
    毒死预言家的女巫阅读 674评论 0 0
  • 双指针: 一个指针是for循环,第二个指针是for循环之外的一个指针(通常是int)。Leetcode 27. R...
    浩泽Hauser阅读 432评论 0 0
  • 一、动态规划最精辟的总结 首先, 动态既不是什么动态,也不是什么规划,存粹就是对递归的优化; 其次,动态规划依赖于...
    外腾湖南阅读 1,064评论 0 0