`最长上升子序列(一)_牛客题霸_牛客网 (nowcoder.com)
给了一个数据,找这个数组的最大上升子序列长度;
[1,5,3,7,3] 数组
dp
数组来记录以每个元素为结尾的最长上升子序列的长度;在每个位置
i
,遍历之前的位置j
,如果满足arr[i] > arr[j]
,即当前元素比之前的元素大,且dp[i] < dp[j] + 1
,表示以位置j
为结尾的上升子序列长度加上当前元素后能够得到更长的上升子序列。因此更新dp[i]
的值为dp[j] + 1
。
class Solution { public: int LIS(vector<int>& arr) { if(arr.size() == 1) return 1; //设置数组长度大小的动态规划辅助数组 vector<int> dp(arr.size(), 1); int res = 0; for(int i = 1; i < arr.size(); i++){ for(int j = 0; j < i; j++){ //可能j不是所需要的最大的,因此需要dp[i] < dp[j] + 1 if(arr[i] > arr[j] && dp[i] < dp[j] + 1) { //i点比j点大,理论上dp要加1 dp[i] = dp[j] + 1; //找到最大长度 res = max(res, dp[i]); } } } return res; } };