简介动态规划(简称DP)是算法设计中最难也最有趣的部分。动态规划适用于具有重叠子问题和最优子结构属性的问题。它是数学、计算机科学和经济学中经常使用的一种方法,通过将原始问题分解为相对简单的子问题来解决复杂问题。使用动态规划方法求解问题具有很高的时间效率。关键是减少了很多不必要的计算和重复计算。它的思想是将大问题拆分成小的子问题。,并且可以从这些小子问题的解推导出原问题的解。同时,为了进行动态规划最优子结构,需要满足以下两个重要性质:分裂子问题的解是最优解。子问题重叠性:在求解过程中,每次产生的子问题并不一定都是新问题,有些子问题会重复计算很多次。动态规划算法利用了这个子问题的重叠性,每个子问题只计算一次,然后将其计算结果保存在一个表中。简单看一下结果,可以获得更高的解题效率。先举个栗子。先引用一个动态规划的经典问题,最长非递减子序列。它的定义是:存在一个由n个不同整数[n]组成的数组b,若存在下标$i_115,所以从63开始,没有做链接,长度还是1。看倒数第二项22,后面还有2项。因此,需要找到大于22且长度最长的值作为这2项之间的链接。由于只有22<63,修改22的值,长度为2,即自身长度加上链接值的长度,链接位置改为13,也就是63的下标。看下倒数第21项,后面还有3项,所以一定要找到大于21的值和这3项中最长的长度作为链接(注意:是长度),很容易看出,值22满足这个条件,所以修改21的长度为3,修改链接位置为12,即22的序列下标。以此类推,最终结果如下:最终状态的转移方程为:$f(i)=max{f(j)}+1(b_j=2){n=arr[0];process.stdin.emit('end')}bool++});process.stdin.on('end',function(){a=arr.slice(1).join("").split("").map(function(index,elem){returnparseInt(index);})for(leti=0;ia[j]){dp[i]=Math.max(dp[j]+1,dp[i])}longest=Math.max(dp[i],longest)}}console.log("最长的长度是:"+longest);process.stdout.write('end');});