动态规划入门:最长递增子序列-300

动态规划入门题目,dp真是太神奇了
动态规划基本思路:
1.设置一个数组dp,从头到尾遍历一遍nums到最后就能得出答案。(一定要和回溯区分开)
2.for遍历每一次都得到目前为止最优解。

首先明确dp的维度,题中仅给了一个字符串,所以设置一维数组即可。
其次要知道dp[i]的含义:截至nums数组中的第i个,当前的最长递增子序列为dp[i]个
所以只要看下一次nums[i+1]能否比前面的数字大。

两种情况:不能的话,不进行操作,因为最后求的是最大值,小的就不用管了,有多小我们是不需要知道的,最后输出max(dp);能的话要和nums中i+1前的所有比其小的dp比大小,max(dp[j]+1,dp[i]),取最大值,因为此时nums中的值比前面的大,所以递增序列一定可以+1,故为dp[j]+1和dp[i]比大小,这样dp中存储的就是截至每个数字,最大的递增子序列,再将dp中的最大值输出,即为整个nums中递增子序列最大的那一个。

Python代码

class Solution:
    def lengthOfLIS(self, nums):
        dp =[1 for i in range(len(nums))]
        for i in range(len(nums)):
            for j in range(0,i):
                if(nums[i]>nums[j]):
                    dp[i]=max(dp[j]+1,dp[i])
        return max(dp)

 


本题LeetCode链接:https://leetcode-cn.com/problems/longest-increasing-subsequence/solution/dong-tai-gui-hua-ji-chu-ti-mu-by-chong-y-71f4/
来源:力扣(LeetCode)

posted @ 2021-01-16 20:48  _YeLL  阅读(172)  评论(0)    收藏  举报