题目描述:给定一个无序的整数数组num,找到其中最长上升子序列的长度。
示例:
输入:[10,9,2,5,3,7,101,18]
输出:4
解释:最长的上升子序列是[2,3,7,101],它的长度是4
典型的动态规划题目,定义一个数组dp,其中dp[i]代表以第num[i]为结尾取得的最长长度,最后返回最大的那个dp[i]就行了,
所以这道题的重点在于怎么求得dp[i]。一开始我们先把dp全部元素都初始化为1,因为dp[i]无论如何最少的长度都是1(只有本身一个元素的序列),然后对于每个num[i]我们可以通过遍历num[0]~num[i-1],如果在这个区间找到一个num[j]比num[i]小,那么开始比较dp[j]+1和dp[i]的大小,如果dp[j]+1>dp[i]则更新dp[i],所以转移方程为dp[i] = max(dp[j]+1,dp[i])。
AC代码如下
int lengthOfLIS(vector<int>& nums) {
if(nums.empty()) return 0;
int len = nums.size();
vector<int> dp(len,1);
int ans = 1;
for(int i = 0;i<len;i++)
{
for(int j = 0;j<i;j++)
{
if(nums[i]>nums[j])
{
dp[i] = max(dp[i],dp[j]+1);
}
if(dp[i]>ans) ans = dp[i];
}
}
return ans;
}