最长递增子序列
一、题目描述
输入一个无序数组,找到其中最长递增子序列的长度。(子序列和子串的区别,子串一定是连续的,子序列不一定是连续的)
二、解题思路
定义一个一维数组dp,dp[i]代表前i个元素中的最长递增子序列。
初始状态dp[0] = 1
状态转移方程:
已知dp[0]怎么求dp[1]?
看1处的值是不是比0处的值大,如果大且 dp[1] < dp[0] + 1,dp[1] = dp[0] + 1,否则dp[1] = 1
已知dp[0] 和dp[1] 怎么求dp[2]?
看2处的值是不是比0处的大,如果大于且dp[2] < dp[0] + 1,dp[2] = dp[0] + 1,否则dp[2] = 1。然后继续看2处的值是不是比1处大,如果大且dp[2] < dp[1]+1,dp[2] = dp[1] + 1,否则dp[2] = 1
最大子数组问题
一、题目描述
给你一个整数数组nums,请你在其中找出一个和最大的子数组,返回这个子数组的和。
注意:子数组是连续的
二、解题思路
最暴力的方法就是二重循环,把每一个子数组的和都算出来,然后取最大的就行了。
但我们能不能用动态规划的方法解题呢?
动态规划的关键就是递推,也就是从一个初始状态慢慢递推,最终得到整个问题的答案。
不妨设dp[i] 为以下标为i的元素结尾的最大子数组和。
初始状态:dp[0] = nums[0]
能否根据dp[0]求出dp[1]? 可以。dp[1]代表以下标为1的元素结尾的最长子数组,以他结尾,则前面可以有也可以没有,如果前面是正数,则dp[i] = dp[i-1] + nums[i] 。否则dp[i] = nums[i];
其实根据上面两个我们可以发现,如果要求子数组是连续的话,则dp数组应该是 以 什么什么结尾的,如果不要求子数组连续的话应该是前n项。