最大连续子序列的和与最长不下降序列

1、连续子数组的最大和–动规求解

例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。
如果用函数dp(i)表示以第i个数字结尾的子数组的最大和,那么我们只需要求出
max[dp(i)],其中可以用如下递归公式。
当i=0时,或者dp(i-1)<=0时,dp(i)=array[i];
当i≠0时,或者dp(i-1)>0时,dp(i)=dp(i-1)+array[i];

        function FindGreatestSumOfSubArray(array) {

            let max = array[0]
            let dp = []
            for (let i = 0; i < array.length; i++) {
                if (i == 0 || dp[i - 1] <= 0) {
                    dp[i] = array[i]
                } else {
                    dp[i] = dp[i - 1] + array[i]
                }
             
                max = dp[i] > max ? dp[i] : max
            }
            return max
        }

2、求最长不下降序列

在一个数字序列中,找到一个最长的子序列,可以不连续,使得这个子序列是不下降的(非递减的)
样例
1 2 3 -1 -2 7 9
最长不下降的子序列是 1 2 3 7 9,长度为5
同用动规求解,与上题亦有异曲同工之妙

        function FindGreatestSumOfSubArray(array) {
            // write code here
            let a = array
            let max = array[0]
            const dp = []
            for (i = 0; i < a.length; i++)//这个循环是求从i为1到n所有数字前面的最长不下降序列,并把数字保存在f数组中 
            {
                dp[i] = 1;
                for (j = 1; j < i; j++) {
                    if (a[j] <= a[i] && dp[j] + 1 > dp[i])//不下降意味着可以等于 
                        dp[i] = dp[j] + 1;
                }
                if (dp[i] > max) {
                    max = dp[i];//每次一个数字循环完,都要求出最长的不下降序列 
                    k = i;//并记录下标,k为最长的不下降序列的下标 
                }
            }
            return { max, k }
        }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值