想通了就不难,一维dp,dp[i]表示数组从0到当前下标的最长上升子序列
初始dp全为1(当前上升子序列为本身 [self])
现在外循环i:0~n-1遍历填涂dp[i]
内循环j:0~i-1遍历下标 i 前面的上升序列数dp[j],如果满足第j数arr[j]<第i数arr[i],说明arr[i]可以与0-j的上升序列一起构成0-i的上升序列,当然,我们和前面的上升序列一起构成个新的自然要挑个最长的(我没有开车),即dp[i]=max(dp[i],dp[j]+1)
最后在dp数组里找到最大的就是要求的最长序列长度啦
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 给定数组的最长严格上升子序列的长度。 * @param arr int整型vector 给定的数组 * @return int整型 */ int LIS(vector<int>& arr) { // write code here vector<int>dp; int n = arr.size(); for (int i = 0; i < n; i++) { dp.push_back(1); } for (int i = 0; i < n; i++) { for (int j = 0; j < i; j++) { if (arr[j] < arr[i]) { dp[i] = max(dp[i], dp[j] + 1); } } } int len = 0; for (int i = 0; i < n; i++) { len = max(len, dp[i]); } return len; } };