动态规划算法:

  1. 将dp数组全部初始化为1,因为最少都有一步,就是这个数字本身,就算一步。
  2. 从num数组第2个元素开始,即下标为1开始,逐步比较前面的元素,如果下标 j < i 且 num[j] < num[i], 则 dp[i] = dp[j]+1,遍历i前面的所有数字,取满足条件的dp[j]的最大值,再加1。 比如nums = [2, 5, 1, 5, 4, 5], 当 i=3,即num[i] = num[3] = 5,遍历i为3时前面所有的数字,即num[0-2], 然后找到满足条件的为num[0] = 2, 则 dp[3] = dp[0]+1
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void async function () {
    // Write your code here
    let arr = [];
    while(line = await readline()){
        arr.push(line);
    };
    // 这里在考试中遇到一个非常邪门的错误,同一组数据,考试中不通过,自测时通过,经检查是 字符串末尾有一个空格,导致出现错误异常,使数组多了一个NaN
    let tt = arr[1].split(' ');
    let nums = [];
    for(let k=0;k<tt.length;k++){
        if(/\d+/.test(tt[k])){
            nums.push(parseInt(tt[k]));
        }
    }
    let m_dp = new Array(parseInt(arr[0])).fill(1);
    for(let i = 1;i<nums.length;i++){
        let max = 0;
        for(let j=0;j<i;j++){
            if(nums[j]<nums[i]){
                let bushu = m_dp[j] +1;
                max = Math.max(bushu,max);
            }
        }
        m_dp[i] = Math.max(m_dp[i],max);
    }
    let max_bushu = Math.max(...m_dp);
    console.log(max_bushu);
}()