动态规划算法:
- 将dp数组全部初始化为1,因为最少都有一步,就是这个数字本身,就算一步。
- 从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); }()