给定一个无序的整数数组,找到其中最长上升子序列的长度。示例:输入: [10,9,2,5,3,7,101,18]输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。说明: 可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。 你算法的时间复杂度应该为 O(n2) 。注意:这里是子序列,可以不连续。
算法:动态规划,我们用dp[i]表示以第i个数字结尾时最长上升子序列长度,那么dp[n]即为所求
状态转移:如果nums[i]>nums[j]&&i>j,则dp[i]=max(dp[i],dp[j]+1);
此题可以与“最长”系列问题进行对比。
class Solution {
public:
int lengthOfLIS(vector<
int>&
nums) {
int n=
nums.size();
if(!n)
return 0;
int res=
1;
vector<
int>dp(n,
1);
for(
int i=
1;i<n;i++
){
for(
int j=
0;j<i;j++
){
if(nums[i]>
nums[j])
dp[i]=max(dp[i],dp[j]+
1);
}
res=
max(res,dp[i]);
}
return res;
}
};
转载于:https://www.cnblogs.com/programyang/p/11152388.html